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