У меня есть проект, использующий Hibernate JPA с persistence.xml и EntityManager
Это мой 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>
У меня есть класс EMF, который обрабатывает EntityManager и EntityManagerFactory
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();
}
Но это не освобождает соединение с пулом. Соединение проходит через тайм-аут и кажется заблокированным.
Когда достигается максимальный размер 20, hibernate не может подключиться к данным.
Может кто-нибудь найти мою ошибку ??
THX
РЕДАКТИРОВАТЬ: Если я удаляю entityManager.persist(t);
это работает! ??
EDIT2: это просто появляется, если у меня есть исключение, в то время как persist();
Edit3: поэтому я узнал, что это произошло из-за исключения, и не откатил транзакцию.
так
emf.getTransaction().rollback();
в блоке catch решил мою проблему