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




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