gpt4 book ai didi

mysql - Hibernate EntityManager 不关闭连接

转载 作者:行者123 更新时间:2023-11-29 03:43:43 26 4
gpt4 key购买 nike

我有一个使用带有 persistence.xml 和 EntityManager 的 Hibernate JPA 的项目

这是我的persitence.xml

    <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="JPAService" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="none"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="*****"/>
<property name="hibernate.connection.password" value="******"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/hibernateTest"/>



<property name="hibernate.c3p0.min_size" value="5"/>
<property name="hibernate.c3p0.max_size" value="20"/>
<property name="hibernate.c3p0.timeout" value="20"/>
<property name="hibernate.c3p0.max_statements" value="50"/>
<property name="hibernate.c3p0.idle_test_period" value="10"/>

</properties>
</persistence-unit>
</persistence>

我有一个处理 EntityManager 和 EntityManagerFactory 的 EMF 类

package entityManager;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EMF {

protected EntityManager entityManager;
protected static EntityManagerFactory entityManagerFactory;
public EMF ()
{

if(entityManagerFactory == null){

System.out.println("EMF.EMF()");
entityManagerFactory = Persistence.createEntityManagerFactory("JPAService");
}

if(entityManager == null || (!entityManager.isOpen()))
{

System.out.println("EMF.EMF().init entityManager");
entityManager = entityManagerFactory.createEntityManager();
}

}

public EntityManager getEM(){
return this.entityManager;
}
public void close(){

while(entityManager.isOpen())
{
System.out.println("EMF.close()");
entityManager.close();
}
entityManager = null;
}
}

当我需要一个 EntityManager 时,我会这样调用它:

  EMF emf =null;
try{
emf = new EMF();
EntityManager entityManager = emf.getEM();

entityManager.getTransaction().begin();
entityManager.persist(t);
entityManager.getTransaction().commit();
}
catch(Exception e)
{
e.printStackTrace();
}
finally(
if(emf != null)
emf.close();
}

但这并没有释放到池中的连接。 Connection 超时运行,似乎已被锁定。

当达到 max_size 20 时,hibernate 无法连接到数据库。

有人能找出我的错误吗??

谢谢

编辑:如果我删除 entityManager.persist(t); 它会起作用!??EDIT2:如果我在 persist();

时出现异常,这只会出现

Edit3:所以我发现这是因为异常,我没有回滚事务。

所以

emf.getTransaction().rollback(); 在 catch block 中解决了我的问题

最佳答案

我发现这是因为异常,我没有回滚事务。

所以

emf.getTransaction().rollback();在 catch block 中解决了我的问题

关于mysql - Hibernate EntityManager 不关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com