You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  • 验证JDBC语句缓存是否彻底禁用:即使配置了JdbcTemplate禁用缓存,也要确认连接池和驱动的缓存参数生效:
    • 连接池(以HikariCP为例):设置hikari.cachePrepStmts=false、hikari.prepStmtCacheSize=0、hikari.prepStmtCacheSqlLimit=0
    • JDBC驱动层面开启日志(如MySQL驱动添加logger=com.mysql.cj.log.Slf4JLogger),观察每次查询是否都向数据库发送新SQL
  • 排查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:52:14