一次线程引发的脏数据

项目添加新功能,功能做完测试阶段在数据库出现脏数据,正常的数据有两种
图片;;;
但是不定时会出现
图片;;;
这样的数据,排查思路是这样的:

一:问题分析。

脏数据应该不是凭空出现的,按照数据内容情况比较像两种类型的数据拼接而成。而chargeDate是Date类型的数据转换而成所以问题应该出现在Date类型处理这方面,查找与chargeDate有关的代码发现大部分对chargeDate的处理都是从容器中添加或取出。只有

chargeDate = sdf.format(DateUtils.addHour(next.getDate("CREATE_TIME"), -8));

这部分代码是转换的部分,可能问题出在这里

而“sdf”是由

private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

整个类公有的,这个Service层数据处理比较多,多个方法,多次使用了sdf.format()方法,所以问题应该出现在多线程抢夺CPU资源而产生脏数据。

二:解决办法

因为问题是因为多个线程共同操作一个sdf引起的,所以只需要把每个线程的sdf变为局部变量就可以了。

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

三:总结

这次的问题找到问题原因并不是这么顺利就找到的,中间也走了弯路,但使我对查找问题有了更好的思维方式。

  1. 出现问题首先要分析问题可能会出现的原因
  2. 定位到代码中,刨去与问题无关的部分
  3. 找到原因,解决问题。

最后写代码方法与方法耦合度不要太高,分层解耦很重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值