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
相关产品推荐
相关产品推荐

