2012-03-13 2 views
2

J'ai un projet en utilisant Hibernate JPA avec persistence.xml et EntityManagerHibernate EntityManager ne ferment pas la connexion

Ceci est mon 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> 

J'ai une classe EMF qui gère la EntityManager et 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; 
    } 
} 

Quand je besoin d'un EntityManager je l'appelle comme ceci:

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(); 
    } 

Mais cela ne libère pas la connexion au pool. La connexion court sur le message d'erreur et semble être verrouillée.

Lorsque la taille maximale de 20 est atteinte, Hibernate ne peut pas se connecter à la base de données.

Quelqu'un peut-il trouver mon erreur ??

THX

EDIT: Si je supprime entityManager.persist(t); cela fonctionne ?? EDIT2: ceci apparaît juste si j'ai une exception pendant que persist();

Edit3: donc j'ai découvert que c'était à cause de l'exception et je n'ai pas annulé la transaction.

si

emf.getTransaction().rollback(); dans le bloc catch a résolu mon problème

Répondre

0

J'ai découvert que cela était dû à l'exception et je n'ai pas annuler la transaction.

si

emf.getTransaction() rollback(). dans le bloc catch a résolu mon problème

Questions connexes