C3p0 с гибернацией не закрывать соединение

У меня есть проект с использованием Hibernate JPA с persistence.xml и EntityManager

<property name = "connection.provider_class"  value = "org.hibernate.connection.C3P0ConnectionProvider"/>
     <!-- Important -->


  <property name = "hibernate.c3p0.min_size" value = "10"/>
  <property name = "hibernate.c3p0.max_size" value = "20"/>
    <property name = "hibernate.c3p0.acquire_increment" value = "1"/>
  <property name = "hibernate.c3p0.minPoolSize" value = "1"/>
  <property name = "hibernate.c3p0.timeout" value = "1800"/>
  <property name = "hibernate.c3p0.max_statements" value = "50"/>
  <property name = "hibernate.c3p0.idle_test_period" value = "3000"/>

У меня есть класс EntityManagerHelper, который обрабатывает EntityManager и EntityManagerFactory.

public class EntityManagerHelper {

static Logger logger = Logger.getLogger(EntityManagerHelper.class);

private static final EntityManagerFactory emf; 
private static final ThreadLocal<EntityManager> threadLocal;

static {
    logger.warn("Criando EM Factory");
    emf = Persistence.createEntityManagerFactory("persistencia");      
    threadLocal = new ThreadLocal<EntityManager>();
}

public static EntityManager getEntityManager() {
    EntityManager em = threadLocal.get();

    if (em == null) {
        em = emf.createEntityManager();
        threadLocal.set(em);
    }
    return em;
}

public static void closeEntityManager() {
    EntityManager em = threadLocal.get();
    if (em != null) {
        logger.info("fechando Transação");
        em.close();
        threadLocal.set(null);
    }
}

public static void closeEntityManagerFactory() {
    logger.warn("Destroindo EM Factory");
    emf.close();
}

public static void beginTransaction() {
    logger.info("iniciando Transação");
    getEntityManager().getTransaction().begin();
}

public static void rollback() {
    getEntityManager().getTransaction().rollback();
}

public static void commit() {
    logger.info("commitando Transação");
    getEntityManager().getTransaction().commit();
} 
}

и я использую этот фильтр

public class JPAFilter implements Filter {

@Override
public void destroy() {}

@Override
public void init(FilterConfig fc) throws ServletException {}

@Override
public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {

        try {
            req.setAttribute("EntityManager", EntityManagerHelper.getEntityManager());
            EntityManagerHelper.beginTransaction();
            chain.doFilter(req, res);
            EntityManagerHelper.commit();
        } catch (RuntimeException e) {

            if ( EntityManagerHelper.getEntityManager() != null && EntityManagerHelper.getEntityManager().isOpen()) 
                EntityManagerHelper.rollback();
            throw e;

        } finally {
            EntityManagerHelper.closeEntityManager();
        }
}
public EntityManager  getEntityManager(){
    return EntityManagerHelper.getEntityManager();
}

}

но соединения не закрываются сиденьем, см. ниже

PostgreSQL

Укажите, пожалуйста, в чем я ошибаюсь.

Заранее спасибо.

Я ничего не вижу "внизу"

Antoniossss 04.09.2018 08:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
108
1

Ответы 1

Пул соединений не предназначен для закрытия соединения. Все дело в обратной ситуации - поддерживать соединения и повторно использовать их. Гораздо эффективнее поддерживать активные соединения в режиме ожидания, чем восстанавливать их по требованию.

В качестве бонуса проверьте https://www.mchange.com/projects/c3p0/ и Приложение C, так как некоторые из ваших свойств конфигурации являются избыточными и / или не имеют никакого эффекта.

Другие вопросы по теме