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

Hibernate 4.3.1 JPA如何从Action启动新的线程注入EntityManager?,hibernate,postgresql,jpa,Hibernate,Postgresql,Jpa,虽然我在persistence.xml中指定了以下内容,但我的应用程序似乎正在泄漏数据库连接: <property name="hibernate.connection.release_mode" value="after_transaction"/> <property name="hibernate.connection.autocommit" value="false"/> 无论我在persistence.xml中将什么值设置为release_mode,如果我不关

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

<property name="hibernate.connection.release_mode" value="after_transaction"/>
<property name="hibernate.connection.autocommit" value="false"/>
无论我在persistence.xml中将什么值设置为release_mode,如果我不关闭连接,连接都不会返回太多池

emFactory.close()
连接总数为100,我最终得到

ERROR [SqlExceptionHelper] FATAL: sorry, too many clients already
在Postgres中,从pg_stat_活动中选择当前_查询;显示

<IDLE>
<IDLE> in transaction
...
提交后不应该自动返回连接吗?也许我应该使用Spring将EntityManagerFactory注入PBM执行器线程。我试着用@PersistenceUnit为它注释一个方法,但它不起作用,只有当Action类注释了一个方法时,它才起作用。在启动EntityManagerFactory之前,将EntityManagerFactory注入操作并将其传递给线程是否安全


谢谢。

如果您使用Spring,为什么要自己创建EntityManagerFactory,为什么还要自己管理事务?一般来说,您希望使用连接池,因此连接将在程序开始时签出,并在程序结束时返回,这不是泄漏,而是出于设计。有时我们只想使用Springbean注入DAO,但有时我们想更严格地控制线程,在它们之间共享连接。如果我使用Persistence.createEntityManagerFactory,hibernate relase_模式配置将不适用?因为释放模式“在事务之后”应该自动返回到池的连接。我的意思是,hibernate有一个默认的内置连接池,对吗?但它应该自动管理这个周期,而不是等我关闭de EntityManagerFatory。如果您混合了策略,那么更糟糕的是,您可能会以重复实例、多个连接池等结束。如果您已经有了Spring,我真的不明白为什么您需要自己处理EMF。更不用说,无论是否使用Spring,基本上整个tx管理都是高度基于线程的,通常不建议在线程之间共享连接或EntityManager。但我可能不理解你的问题,连接池会一直保持连接打开,但不会关闭连接,连接只会返回到池中。问题出在其他地方。我真的不需要手动使用EntityRangerFactory,为什么不能使用Spring管理的呢?你只是在增加复杂性。您也可能会遇到麻烦,就像您做错了事情一样,最终会得到EntityManagerFactory的多个实例,每个实例都有自己的连接池。
<IDLE>
<IDLE> in transaction
...
INFO [DriverManagerConnectionProviderImpl] HHH000115: Hibernate connection pool size: 20 (min=1)