在Java SE环境中运行的桌面应用程序(没有DI,没有JPA,普通Java以外的框架),最好为持久层中的每个操作创建一个新的EntityManager,或者共享EntityManager的单个实例在整个持久层?
两种解决方案的Pro / Cons?
更新
应用程序使用一个只有一个模式的数据库实例。
答案 0 :(得分:3)
至少有三个充分的理由让每次操作都有一个EM。
如果任何其他进程修改数据库(或者即使同一进程使用JDBC或批处理查询来修改数据库),EM也会在其缓存中包含过时数据。如果您的EM仅在交易期间存在,则几乎没有必要处理过时数据的风险。
如果EM发生任何异常,则其状态不再可靠,并且必须关闭EM。
如果多个线程访问EntityManager,则每个线程需要一个EM,因为EM不是线程安全的。
这是第四个:即使假设一切都很好,只有一个线程访问数据库,EM的缓存会增长并消耗内存。您还有可能在缓存中出现不一致的对象图,因为您忘记初始化关联的反面。每个事务有一个EM没有这个问题。
答案 1 :(得分:1)
EntityManager
是JPA世界的切入点。它提供API来访问JPA会话并管理架构。它还拥有缓存。
所以,恕我直言,没有理由每次操作EntityManager
。每个数据库架构可能有理由保留EntityManager
。例如,如果您的应用程序使用2个完全不同的没有任何共享表的数据库模式,则可以对每个模式使用EntityManager
。