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

Spring Boot中data-envers数据库连接8小时后断开问题求助

问题解决方案

核心原因

Envers查询失效但普通JPA正常,说明主连接池的配置未覆盖到Envers的连接使用场景,或Envers复用了长期未验证的失效连接——通常是数据库默认8小时的wait_timeout导致连接闲置超时,而Envers的查询逻辑未触发连接池的有效性验证。

针对性解决步骤

  1. 调整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
    
  2. 开启空闲连接定期验证
    仅靠testOnBorrow可能无法覆盖Envers长期空闲的连接,需开启testWhileIdle并配置定期检测:

    spring:
      datasource:
        hikari:
          test-while-idle: true
          time-between-eviction-runs-millis: 60000  # 每分钟检测一次空闲连接
          validation-query: SELECT 1
          validation-timeout: 5000
    
  3. 确保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);
        }
    }
    
  4. 检查自定义Envers配置,复用主连接池
    若自定义了AuditReaderFactory或EntityManagerFactory,需确保复用主数据源的Hikari配置,禁止创建独立的未配置连接验证的数据源:

    • 避免手动创建EntityManagerFactory实例,优先使用Spring自动配置的实例
    • 若需自定义Envers审计配置,通过@EnableJpaAuditing和AuditConfigurer扩展,而非替换核心连接池逻辑

验证方案

修改配置后,模拟数据库连接超时(可通过手动重启数据库或修改wait_timeout为1分钟测试),观察Envers查询是否能自动恢复,无需重启服务。

内容的提问来源于stack exchange,提问作者Talenel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:15:34