Hibernate 4.3.1 JPA如何启动新的线程从Action注入EntityManager?

时间:2014-09-01 06:40:37

标签: hibernate postgresql jpa

我的应用程序似乎正在泄漏数据库连接,尽管我在persistence.xml中指定了以下内容:

<property name="hibernate.connection.release_mode" value="after_transaction"/>
<property name="hibernate.connection.autocommit" value="false"/>

我也使用Spring 3.2.7来管理Connections,但仅限于Web部分。系统执行业务流程图,并在此部分以这种方式获取连接:

EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("servicos");

em = emFactory.createEntityManager();
em.getTransaction().begin();
em.getTransaction().commit();
em.close();

无论我在persistence.xml中设置为release_mode的值是什么,如果我没有关闭与

的连接,连接将无法返回池。
emFactory.close()

连接总数达到100,我最终得到

ERROR [SqlExceptionHelper] FATAL: sorry, too many clients already

在Postgres中,SELECT current_query FROM pg_stat_activity;示出了

<IDLE>
<IDLE> in transaction
...

Hibernate日志显示

INFO [DriverManagerConnectionProviderImpl] HHH000115: Hibernate connection pool size: 20 (min=1)

提交后是不是应该自动返回连接?也许我应该将EntityManagerFactory注入带有Spring的PBM执行器线程中。我尝试使用@PersistenceUnit注释一个方法,但它没有工作,只有当Action类有一个注释方法时才有效。在启动之前将注入Action的EntityManagerFactory传递给Thread是否安全?

感谢。

0 个答案:

没有答案