Java JPA-使用多实体管理器的性能

Java JPA-使用多实体管理器的性能,java,jpa,persistence,seam,openjpa,Java,Jpa,Persistence,Seam,Openjpa,我的情况是: 代码不是我的 我有两种数据库:一种是爸爸,一种是儿子 在Dad中,我有一个表来存储JNDI名称。我将使用JNDI查找Dad,创建实体管理器,并检索此表 根据这些检索到的JNDI名称,我将使用多个Son数据库创建多个实体管理器 问题是: 儿子有数千个实体。每个子数据库加载所有实体大约需要10分钟。如果有4个Son数据库,则需要40分钟 我的问题: 假设我们已经创建了一个实体管理器(随时可用),那么有没有办法在创建之后加快这些实体管理器的创建速度(这只在连接方面有所不同)

我的情况是:

  • 代码不是我的
  • 我有两种数据库:一种是爸爸,一种是儿子
  • 在Dad中,我有一个表来存储JNDI名称。我将使用JNDI查找Dad,创建实体管理器,并检索此表
  • 根据这些检索到的JNDI名称,我将使用多个Son数据库创建多个实体管理器
问题是:

  • 儿子有数千个实体。每个子数据库加载所有实体大约需要10分钟。如果有4个Son数据库,则需要40分钟
我的问题:

  • 假设我们已经创建了一个实体管理器(随时可用),那么有没有办法在创建之后加快这些实体管理器的创建速度(这只在连接方面有所不同)
请查看下面的代码
对于每个子JNDI:

Map<String, String> puSonProperties = new HashMap<String, String>();
puSonProperties.put("javax.persistence.jtaDataSource", sonJndi);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PUSon", puSonProperties);

我猜这是所有实体加载开始的实际代码。10分钟。

查看Hibernate中的二级缓存(如果您使用的是Hibernate)。然而,你所说的是相当矛盾的,你说有4子DB。对于每个DB,它通常由4个EMF而不是EM表示。对于来自不同DB/EMF的事物,它意味着不同,您不应该和不合理地共享实体。此外,为什么要加载“所有实体”?我怀疑你想要的是否真的是JPA…哦,对不起。我的意思是有4个sonJndi,所以上面的代码,emf实际上是针对每个子数据库的,而不是针对所有子数据库的。关于“加载所有实体”,我猜是因为它在那里运行了10分钟。代码不是我的,所以我认为所有者应该在那里创建一个小查询来触发加载所有实体的操作。这些代码实际上是在启动时运行的,因此他希望在用户登录之前加载所有实体。如果是这样,简短的回答是:您想要做的是不合理的。在emf之间共享实体是不合理的,因为不同的emf在逻辑上意味着不同的持久性存储,而其中的实体意味着不同。我相信你可能想重新审视你的设计。如果您认为您可以共享,那么我认为您不应该将它们视为不同的实体,或者您应该将您的共享实体放在它们自己的上下文中。我认为这与多租户体系结构相同,在多租户体系结构中,我们为每个租户提供一个数据库,而不是每行提供一个租户。正如我所说,我不能修改这段代码。也许我应该这样重新表述我的问题:假设我们已经创建了一个实体管理器(准备好使用),那么有没有办法在创建之后加快这些实体管理器的创建速度(这只是在连接上有所不同)。我认为设计有问题。EntityManager不是设计成这样工作的,它们应该是相当短暂的(例如,每个事务的EM通常都是这样)。正如您所注意到的,加载大量实体将大大降低EM的速度,因为它正在缓存所有对象。现在还不清楚为什么必须一次加载所有实体。如果EM只在确实需要的时候按需加载实体,这还不够吗?
log.info("Verify entity manager for son: {0} - {1}", sonCode, 
         emSon.find(Son_configuration.class, 0) != null ? "ok" : "failed!");