- 问题现象
后台数据刷新服务,通过接收消息实时将mysql数据刷入redis中,通过数据库和缓存监控对比,
发现时常会有redis缓存数据未刷新到最新数据;
- 问题排查
项目逻辑不是很复杂,导致不一致只有可能是
a. mysql数据更新时,消息未同步发出;
通过数据库里数据更新时间和我这系统接收时间比对,排除了mysql数据和消息不一致的问题
b. 哪里有缓存,导致取到的是老数据;
现在是要验证hibernate查询数据库是否有命中了一级缓存,
首先打开hibernate的sql日志true
执行发现在同一个线程中,调用两次相同查询,只有第一次打出sql日志;基本确定就是一级缓存搞得鬼;
- 问题解决
hibernate的一级缓存是在同一个线程中,session相同会导致命中一级缓存,这个一级缓存是无法关闭的,通过查看HibernateTemplate源码发现,我们可以支持强制每次查询创建session;
enforceNewSession强制每次创建session
可在生成HibernateTemplate bean是设置该参数为true