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

EntityManager.close()未将数据库连接释放回连接池的问题排查求助

EntityManager.close()未将数据库连接释放回连接池的问题排查求助

我有一个老旧的Spring应用,使用以下Spring JPA和Hibernate的配置:

<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>

        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="false" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
            </bean>
        </property>        
        <property name="persistenceUnitName" value="LPU"/>
        <property name="persistenceUnitManager">
            <bean class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
                <property name="defaultDataSource" ref="dataSource"></property>
            </bean>
        </property>
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property>
    </bean>

DAO代码已经正确注入了上述EMF,并且使用ThreadLocal来获取/创建EntityManager。使用完EM后,会调用em.close()。但即使调用了em.close(),HikariCP连接池的统计数据显示连接并没有被释放回池里,这导致连接池耗尽了所有连接。

有没有人知道这个配置里可能哪里出问题了?


后续补充内容:

我移除了HibernateJpaVendorAdapter,并在persistence.xml中添加了以下配置,但情况没有任何变化:

<persistence-unit name="LPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>    
    <properties>
    <property name="hibernate.connection.release_mode" value="after_transaction" />
    <property name="hibernate.current_session_context_class" value="jta" />        
     </properties>
</persistence-unit>

我已经确保在请求结束时通过过滤器调用了entityManager.close(),没有其他打开的EntityManager实例。

public void closeEntityManager(){
    EntityManager em = (EntityManager) threadLocal.get();
    if (em != null && em.isOpen()) {
        if(em.isJoinedToTransaction()){
            em.getTransaction().commit();
        }
        em.flush();
        em.clear();
        em.close();
        //((org.hibernate.Session) em.getDelegate()).close();
        threadLocal.remove();
  }
}

我还尝试把连接池实现从HikariCP换成Apache Commons DBCP,但结果还是一样:Hibernate没有把数据库连接释放回连接池。


备注:内容来源于stack exchange,提问作者Priyshrm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:09:34