Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA桌面应用程序EntityManager的一个或多个实例_Java_Jpa_Desktop Application_Entitymanager - Fatal编程技术网

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

Java JPA桌面应用程序EntityManager的一个或多个实例,java,jpa,desktop-application,entitymanager,Java,Jpa,Desktop Application,Entitymanager,在Java SE环境中运行的桌面应用程序中(没有DI,除了JPA、纯Java之外没有其他框架),最好为持久层中的每个操作创建一个新的EntityManager,或者在整个持久层中共享EntityManager的一个实例 两种解决方案的利弊 更新: 该应用程序只使用一个DB实例和一个模式。EntityManager是JPA world的入口点。它提供API来访问JPA会话并管理模式。它还保存缓存 因此,IMHO没有理由为每个操作保留EntityManager。可能有理由根据数据库架构保留Entit

在Java SE环境中运行的桌面应用程序中(没有DI,除了JPA、纯Java之外没有其他框架),最好为持久层中的每个操作创建一个新的EntityManager,或者在整个持久层中共享EntityManager的一个实例

两种解决方案的利弊

更新:


该应用程序只使用一个DB实例和一个模式。

EntityManager
是JPA world的入口点。它提供API来访问JPA会话并管理模式。它还保存缓存


因此,IMHO没有理由为每个操作保留
EntityManager
。可能有理由根据数据库架构保留
EntityManager
。例如,如果您的应用程序使用两个完全不同的DB模式,但没有任何共享表,则可以对每个模式使用
EntityManager

至少有三个理由可以让每个操作使用一个EM

如果任何其他进程修改数据库(或者即使同一进程使用JDBC或批处理查询修改数据库),EM的缓存中将有过时的数据。如果您的EM只在事务期间存在,那么您几乎没有处理过时数据的风险

如果EM出现任何异常,则其状态不再可靠,必须关闭EM

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


还有第四个问题:即使假设一切都正常,只有一个线程访问数据库,EM的缓存也会增长,并消耗内存。由于忘记初始化关联的反向端,缓存中存在对象图不一致的风险。每个事务有一个EM没有这个问题。

EntityManager不管理模式。EntityManagerFactory就是这样做的。每个操作有一个EM至少有三个理由:如果任何其他进程修改数据库(或者即使同一进程使用JDBC或批处理查询修改数据库),EM的缓存中将有过时的数据。若EM发生任何异常,则其状态不再可靠。如果有多个线程访问EntityManager,则每个线程需要一个EM,因为EM不是线程安全的。这一点很好,@JB nitet。你为什么不发表你的评论作为另一个答案呢?