У меня есть проект, используя Hibernate JPA с persistence.xml и EntityManagerHibernate 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();
}
Но это не освобождает подключение к бассейну. Соединение работает над тайм-аутом и, кажется, заблокировано.
Когда max_size из 20 достигнут спящего режима, он не может подключиться к данным.
Может кто-нибудь найти ошибку?
THX
EDIT: Если я удалю entityManager.persist(t);
это работает ?? EDIT2: это просто появляется, если у меня есть исключение, в то время как persist();
Редактировать 3: так что я узнал, что это было из-за исключения, и я не отменил транзакцию.
так
emf.getTransaction().rollback();
в блоке поймать решить мою проблему