我坚持通过多个连接到数据库的实体。处理持久化的类实现了可运行接口,并且我在run()方法中创建了EntityManagers。在阅读this之后,我想知道是否最好在类构造函数或静态初始化块中初始化EntityManagerFactory。在多线程环境中初始化EntityManagerFactory
0
A
回答
1
我假设你在Java SE中使用JPA而不是Java EE。此外,我认为你有一个类来处理你的实体的持久性 - 当你要求类构造函数或静态初始化时,你的意思是这个类。此外,我假设你所有的多连接都是针对同一个数据库的......我假设你不重用你的实例:既不是你的实例,也不是你的可运行类实例。
如果假设是正确的,那么我宁愿初始化EntityManagerFactory
,要么是对可运行类进行静态初始化,要么是以单例实现的第二个类。
如果在可运行类的类构造函数中创建EntityManagerFactory
,则每个实例(即每个线程)都有一个工厂。这是可能的,但不必要,因为对于多个逻辑相同的EntityManager
实例,您只需要一个EntityManagerFactory
。
另一个问题是在哪里创建EntityManager
本身:在类的构造函数中(允许您在启动线程的早期捕获错误)或者在方法run
中。个人而言,我宁愿run
- 方法,因为它允许您创建和关闭在该EntityManager
在使用try/finally
)同样的方法
警告:要知道,你有多个线程之间没有任何交易。
相关问题
- 1. 多线程环境中初始化的内存语义(C++)
- 2. Scala - 初始化REPL环境
- 3. Rails:每个环境初始化程序?
- 4. CherryPy + Jinja,在哪里初始化环境
- 5. 初始化多线程中的向量
- 6. 错误:不允许在环境中使用初始化程序
- 7. AnyEvent在多线程环境
- 8. 在多线程环境
- 9. JAVA初始化数据库环境
- 10. 初始化批处理环境
- 11. Fastlane不初始化环境变量--env
- 12. Azure角色环境未初始化
- 13. 多线程懒惰初始化
- 14. 为什么eb cli在初始化多环境时崩溃
- 15. ShellExecuteEx和在VCL线程中初始化
- 16. 在开发环境轨道上跳过初始化程序
- 17. 在多线程C#程序中执行一次初始化
- 18. 初始化主线程
- 19. 在多线程环境中生成PDF
- 20. 在多线程环境中使用NLog
- 21. Shiro在多线程环境中
- 22. 在.net中调试多线程环境
- 23. 在多线程环境中使用CList
- 24. 在多线程环境中重绘
- 25. 在多线程环境中使用TraceSource
- 26. 在多线程环境中使用StringBuilder
- 27. 在多线程环境中休眠
- 28. 在多线程环境中使用Log4Net
- 29. 在多线程环境中读取值
- 30. 在多线程环境中使用sqlite
我认为需要注入EntityManagerFactory,然后在每个线程中创建一个新的EntityManager,因为您的应用程序也需要线程安全,这也是我用于类似需求的解决方案。 – 2013-02-27 23:34:02