2013-02-27 76 views
0

我坚持通过多个连接到数据库的实体。处理持久化的类实现了可运行接口,并且我在run()方法中创建了EntityManagers。在阅读this之后,我想知道是否最好在类构造函数或静态初始化块中初始化EntityManagerFactory。在多线程环境中初始化EntityManagerFactory

+0

我认为需要注入EntityManagerFactory,然后在每个线程中创建一个新的EntityManager,因为您的应用程序也需要线程安全,这也是我用于类似需求的解决方案。 – 2013-02-27 23:34:02

回答

1

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

如果假设是正确的,那么我宁愿初始化EntityManagerFactory,要么是对可运行类进行静态初始化,要么是以单例实现的第二个类。

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

另一个问题是在哪里创建EntityManager本身:在类的构造函数中(允许您在启动线程的早期捕获错误)或者在方法run中。个人而言,我宁愿run - 方法,因为它允许您创建和关闭在该EntityManager在使用try/finally)同样的方法

警告:要知道,你有多个线程之间没有任何交易。