Spring Boot 3.2.5 JDBC缓存问题求助:无法实时读取DB数据变更
排查方向
- 检查ORM框架隐式缓存:Spring Boot默认可能自动引入JPA/Hibernate、MyBatis等ORM依赖,哪怕原代码用JDBC,这些框架的一级/二级缓存会拦截查询结果。确认是否存在
spring-boot-starter-data-jpa或mybatis-spring-boot-starter依赖,若有则禁用缓存:- Hibernate:添加配置
hibernate.cache.use_second_level_cache=false - MyBatis:添加配置
mybatis.configuration.local-cache-scope=statement
- Hibernate:添加配置
- 验证JDBC语句缓存是否彻底禁用:即使配置了JdbcTemplate禁用缓存,也要确认连接池和驱动的缓存参数生效:
- 连接池(以HikariCP为例):设置
hikari.cachePrepStmts=false、hikari.prepStmtCacheSize=0、hikari.prepStmtCacheSqlLimit=0 - JDBC驱动层面开启日志(如MySQL驱动添加
logger=com.mysql.cj.log.Slf4JLogger),观察每次查询是否都向数据库发送新SQL
- 连接池(以HikariCP为例):设置
- 排查Spring Boot自动缓存机制:检查是否引入
spring-boot-starter-cache依赖,或配置类中是否开启@EnableCaching,若查询方法被自动加上@Cacheable注解会导致结果缓存。需移除缓存依赖或给查询方法添加@CacheEvict(按需) - 检查事务隔离与生命周期:若查询被包裹在长事务中,REPEATABLE READ等隔离级别会导致同一事务内无法读取最新数据。确认查询方法是否带有
@Transactional,尝试显式设置隔离级别为READ_COMMITTED,或确保每次查询都在独立事务中执行 - 确认内存缓存问题:排查是否存在单例Bean/静态变量在启动时加载映射表数据并复用,未做实时刷新。Karaf与Spring Boot的Bean生命周期、类加载机制不同,可能原代码在Karaf中是按需读取,迁移后变为单次加载
- 数据库层面验证:用数据库客户端执行相同SQL,对比应用查询结果,排除数据库自身缓存(如已废弃的MySQL query_cache)或MVCC可见性问题
内容的提问来源于stack exchange,提问作者Cbraden
相关产品推荐
相关产品推荐

