Java JPA桌面应用程序EntityManager的一个或多个实例
在Java SE环境中运行的桌面应用程序中(没有DI,除了JPA、纯Java之外没有其他框架),最好为持久层中的每个操作创建一个新的EntityManager,或者在整个持久层中共享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
该应用程序只使用一个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。你为什么不发表你的评论作为另一个答案呢?