Entitymanager实例的生命周期

时间:2013-10-04 06:25:02

标签: jpa entitymanager

我需要在EJB3环境中创建一个Statelebean来创建一个Container Managed EntityManager实例(使用@PersistenceContext)。 在这个创建的单个无状态bean中,我们创建在特定时间间隔内执行的线程。这个帖子将运行数月。 我怀疑从容器中获取的单个EntityManager实例(使用CMP)是否可以在整个生命周期中使用(> 1yrs)。

2 个答案:

答案 0 :(得分:1)

到EntityManager的生命周期:我认为这更像是数据库连接生命周期的问题。在这种情况下,当JPA提供程序检测到连接超时时,如果您将JDBC连接字符串配置为autoReconnect=true,则可能会建立另一个连接。此外,您应该搜索设置大超时的可能性。

另一方面,您可能忽略了EJB中不允许打开新线程的情况。在您的情况下,当涉及到托管实体(在不同线程中更改)和事务问题时,您会遇到一些问题。相反,我会使用Timer Service

答案 1 :(得分:1)

EntityManager似乎意味着代表一个事务空间。对我而言,在一个长期存在的线程的整个生命周期中使用单个事务空间是没有意义的,但这取决于您的设计和提供程序实现的可行性。如果要使用单个EM,请确保它不在线程之间共享,并监视其资源使用情况,因为JPA要求将通过它们读取的每个实体作为托管实例进行缓存;您可能偶尔会调用em.clear()来分离托管实例,以便它们可以在逻辑点进行垃圾回收。

我不认为注入会起作用,因为容器应该将EntityManager绑定到它注入的bean的生命周期,而不是线程的生命周期。您将需要获取EntityManagerFactory并获取/管理您自己的线程的EntityManager生命周期。