我有一个要求,我们创建一个 Statelebean,它在 EJB3 环境中创建一个容器管理的 EntityManager 实例(使用 @PersistenceContext)。在创建的这个单一无状态 bean 中,我们创建了在特定时间间隔内执行的线程。该线程将运行数月。我怀疑从容器(使用 CMP)获得的单个 EntityManager 实例是否可以用于整个生命周期(> 1 年)。
问问题
407 次
2 回答
1
EntityManager 似乎意味着代表一个事务空间。对我来说,在一个长期存在的线程的整个生命周期中使用单个事务空间是没有意义的,但这取决于您的设计和提供程序实现的可行性。如果要使用单个 EM,请确保它不在线程之间共享,并监视其资源使用情况,因为 JPA 要求它们将通过它们读取的每个实体缓存为托管实例;您可能希望偶尔调用 em.clear() 来分离托管实例,以便可以在逻辑点对它们进行垃圾收集。
我不认为注入会起作用,因为容器应该将 EntityManager 与其注入的 bean 的生命联系起来,而不是线程的生命。您将需要获取 EntityManagerFactory 并为您的线程获取/管理您自己的 EntityManager 生命周期。
于 2013-10-04T16:24:19.400 回答
1
对于EntityManager的生命周期:我认为这更多的是DB连接生命周期的问题。在这种情况下,当 JPA 提供程序检测到连接超时时,如果您配置了 JDBC 连接字符串,autoReconnect=true
您会期望建立另一个连接。此外,您应该寻找设置大超时的可能性。
另一方面,您可能忽略了在 EJB 中不允许打开新线程。在您的情况下,当涉及托管实体(在不同线程中更改)和事务问题时,您会遇到一些问题。相反,我会使用Timer Service。
于 2013-10-04T08:45:02.830 回答