JPA桌面应用程序EntityManager的单个或多个实例

时间:2014-05-18 08:21:17

标签: java jpa desktop-application entitymanager

在Java SE环境中运行的桌面应用程序(没有DI,没有JPA,普通Java以外的框架),最好为持久层中的每个操作创建一个新的EntityManager,或者共享EntityManager的单个实例在整个持久层?

两种解决方案的Pro / Cons?

更新

应用程序使用一个只有一个模式的数据库实例。

2 个答案:

答案 0 :(得分:3)

至少有三个充分的理由让每次操作都有一个EM。

如果任何其他进程修改数据库(或者即使同一进程使用JDBC或批处理查询来修改数据库),EM也会在其缓存中包含过时数据。如果您的EM仅在交易期间存在,则几乎没有必要处理过时数据的风险。

如果EM发生任何异常,则其状态不再可靠,并且必须关闭EM。

如果多个线程访问EntityManager,则每个线程需要一个EM,因为EM不是线程安全的。

这是第四个:即使假设一切都很好,只有一个线程访问数据库,EM的缓存会增长并消耗内存。您还有可能在缓存中出现不一致的对象图,因为您忘记初始化关联的反面。每个事务有一个EM没有这个问题。

答案 1 :(得分:1)

EntityManager是JPA世界的切入点。它提供API来访问JPA会话并管理架构。它还拥有缓存。

所以,恕我直言,没有理由每次操作EntityManager。每个数据库架构可能有理由保留EntityManager。例如,如果您的应用程序使用2个完全不同的没有任何共享表的数据库模式,则可以对每个模式使用EntityManager