前阵子项目有个需求,对历史数据处理生成新数据.
具体做的就是 从表A查询 -> 插入表B -> 对表A更新标志位
因为数据量大概有500万甚至更多,所以采用了每次查询5000条,开4线程去更新. 使用countDownLatch做的同步,4个线程把5000条数据处理完以后再查5000,一直到所有数据全部处理完.
实际运行的时候就是,主线程反复查询到的5000条没有变化. 子线程对数据的更新主线程感知不到.
后来查资料发现,对于当前sqlSession,如果一个表没有被update或者delete,查询的结果是拿上次的查询结果.与hibernate类似,session不是同一个,这也是与事务实现的有关系的.
虽然本人最终是使用了MQ做的中间件处理的数据,但是忙完以后又查了查这个问题.
网上给出的答案是调用
SqlSessionUtils.getSqlSession(sqlSessionFactory).clearCache();
具体获取SqlSession 也可以看看这篇文章
本文介绍了一种在使用MyBatis进行大量数据处理时遇到的问题:由于缓存机制,主线程无法感知到子线程对数据的更新。通过分析问题原因及解决方案,包括使用CountDownLatch进行线程同步和调用SqlSession的clearCache方法来刷新缓存,最终解决了数据更新不一致的问题。
684

被折叠的 条评论
为什么被折叠?



