Spring Boot中data-envers数据库连接8小时后断开问题求助
问题解决方案
核心原因
Envers查询失效但普通JPA正常,说明主连接池的配置未覆盖到Envers的连接使用场景,或Envers复用了长期未验证的失效连接——通常是数据库默认8小时的wait_timeout导致连接闲置超时,而Envers的查询逻辑未触发连接池的有效性验证。
针对性解决步骤
调整Hikari连接池超时参数,主动回收旧连接
数据库默认wait_timeout为8小时,需将Hikari的max-lifetime设置为小于该值(建议设为29分钟左右,避免与数据库超时时间重合),让连接池主动淘汰即将失效的连接:spring: datasource: hikari: max-lifetime: 1750000 # 约29分钟,需小于数据库wait_timeout(默认28800秒=8小时) connection-timeout: 30000 minimum-idle: 5 maximum-pool-size: 20开启空闲连接定期验证
仅靠testOnBorrow可能无法覆盖Envers长期空闲的连接,需开启testWhileIdle并配置定期检测:spring: datasource: hikari: test-while-idle: true time-between-eviction-runs-millis: 60000 # 每分钟检测一次空闲连接 validation-query: SELECT 1 validation-timeout: 5000确保AuditReader不被缓存,每次查询重新获取
若缓存了AuditReader实例,它持有的失效连接无法自动重连,需每次查询时通过AuditReaderFactory从当前EntityManager获取:@Service public class AuditQueryService { @PersistenceContext private EntityManager entityManager; public List<Number> getEntityRevisions(Long entityId) { // 每次查询都重新获取AuditReader,避免复用失效连接 AuditReader auditReader = AuditReaderFactory.get(entityManager); return auditReader.getRevisions(TargetEntity.class, entityId); } }检查自定义Envers配置,复用主连接池
若自定义了AuditReaderFactory或EntityManagerFactory,需确保复用主数据源的Hikari配置,禁止创建独立的未配置连接验证的数据源:- 避免手动创建
EntityManagerFactory实例,优先使用Spring自动配置的实例 - 若需自定义Envers审计配置,通过
@EnableJpaAuditing和AuditConfigurer扩展,而非替换核心连接池逻辑
- 避免手动创建
验证方案
修改配置后,模拟数据库连接超时(可通过手动重启数据库或修改wait_timeout为1分钟测试),观察Envers查询是否能自动恢复,无需重启服务。
内容的提问来源于stack exchange,提问作者Talenel
相关产品推荐
相关产品推荐

