zoukankan      html  css  js  c++  java
  • 由DateFormat引起的线程安全问题

    有一次在测试环境中有个插入重复主键的问题,代码如下

    @Transactional
        public void lending(OrderExtend order) {
    
    Date date = DateUtil.getCountyTime();
    
    ...................................
    
                            
            // 更新限额金额
                            String nowDate = DateUtil.timeToString(date, DateUtil.DATE_FORMAT_23);
    
    
    OrderLimit limit = orderLimitMapper.selectLimitByDate(nowDate, order.getAppPackage());
                            if (limit == null) {//
                                SystemOption record = new SystemOption();
                                record.setOptionGroup("dailyorderlimit");
                                record.setOptionKey(order.getAppPackage());
                                List<SystemOption> list = systemOptionMapper.selectBySelective(record);
    
                                limit = new OrderLimit();
                                limit.setAppName(order.getAppName());
                                limit.setAppPackage(order.getAppPackage());
                                limit.setLimitTime(date);
                                limit.setApplyNumber(1);
                                limit.setApplyAmount(order.getLendingAmount());
                                limit.setUpdateTime(date);
                                limit.setMaxNumber(Integer.valueOf(list.get(0).getOptionValue()));
                                orderLimitMapper.insertSelective(limit);
                            } else {
                                limit.setLimitTime(date);
                                limit.setUpdateTime(date);
                                limit.setApplyAmount(order.getLendingAmount());
                                orderLimitMapper.updateOrderLimitAmount(limit);
                            }
    
    
    }
    
    
    public class DateUtil {
    
        public static SimpleDateFormat DATE_FORMAT_23 = new SimpleDateFormat("yyyy-MM-dd");

    public static String timeToString(Date d, DateFormat dateFormat) { if (d == null) { return null; } return dateFormat.format(d); } }

    原因是orderLimitMapper.selectLimitByDate找不到值,结果插入导致重复的唯一键。然后分析居然是sql里传入的时间不对,传入的时间是个莫名奇妙的日期,但这个时间是在方法内定义的一个局部变量啊,应该不是线程安全啊。结果我想错了,因为DATE_FORMAT_23是一个静态变量,在方法区的变量照样是在堆里的,同样会遇到线程安全的问题。网上一查果然SimpleDateFormat不是线程安全的

    喜欢艺术的码农
  • 相关阅读:
    Docker容器案例:应用 Mysql
    rpm 命令参数使用详解
    MySQL中的两种临时表
    Yum本地Rpm库设置
    编程学习 博客
    yum -------包安装库
    Linux 基础 —— RPM
    在CentOS上编译安装PostgreSQL
    Linux上安装JDK环境变量配置
    yum_rpm(利用dvd建立本地yum库)
  • 原文地址:https://www.cnblogs.com/zjhgx/p/10145367.html
Copyright © 2011-2022 走看看