在多线程环境中初始化EntityManagerFactory

时间:2013-02-27 19:57:26

标签: java multithreading jpa concurrency jpa-2.0

我通过与数据库的多个连接来持久化实体。处理持久化的类实现了runnable接口,我在run()方法中创建了EntityManagers。在阅读this之后,我想知道在类构造函数或静态初始化块中初始化EntityManagerFactory是否更好。

1 个答案:

答案 0 :(得分:1)

我假设你在Java SE中使用JPA而不是Java EE。此外,我假设您有一个处理实体持久性的类 - 当您要求类构造函数静态启动时,您指的是此类。此外,我假设您的所有多个连接都针对同一个数据库......我假设您不重用您的实例:既不是您的EntityManager实例也不是您的可运行类实例。

如果这些假设是正确的,那么我宁愿在你的runnable类的静态启动中或在第二个实现为singleton的类中初始化EntityManagerFactory

如果在runnable类的类构造函数中创建EntityManagerFactory,则每个实例(每个线程)有一个工厂。这是可能的,但不必要,因为对于多个逻辑相同的EntityManagerFactory实例,您只需要一个EntityManager

另一个问题是在哪里创建EntityManager本身:在类构造函数中(允许您在初始化线程的早期捕获错误)或在run - 方法中。我个人更喜欢run - 方法,因为它允许您使用EntityManager在同一方法中创建和关闭try/finally

警告:请注意,您没有跨多个线程的交易。