2012-03-13 7 views
2

У меня есть проект, используя 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(); в блоке поймать решить мою проблему

ответ

0

я узнал, что это из-за исключением, и я не откатить транзакцию.

так

emf.getTransaction() откат(). в блоке catch решена моя проблема

Смежные вопросы