Hibernate EntityManager не закрывает соединение - PullRequest
2 голосов
/ 13 марта 2012

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

1 Ответ

0 голосов
/ 06 декабря 2017

Я обнаружил, что это произошло из-за исключения, и не откатил транзакцию.

так

.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...