项目添加新功能,功能做完测试阶段在数据库出现脏数据,正常的数据有两种
但是不定时会出现
这样的数据,排查思路是这样的:
一:问题分析。
脏数据应该不是凭空出现的,按照数据内容情况比较像两种类型的数据拼接而成。而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");
三:总结
这次的问题找到问题原因并不是这么顺利就找到的,中间也走了弯路,但使我对查找问题有了更好的思维方式。
- 出现问题首先要分析问题可能会出现的原因
- 定位到代码中,刨去与问题无关的部分
- 找到原因,解决问题。
最后写代码方法与方法耦合度不要太高,分层解耦很重要。