Java 处理JPA缓存
我的persistence.xml中有许多持久性单元,一个是postgreSQL模式 我通过动态创建EntityManagerFactory,随时实例化EntityManager:Java 处理JPA缓存,java,caching,jpa,Java,Caching,Jpa,我的persistence.xml中有许多持久性单元,一个是postgreSQL模式 我通过动态创建EntityManagerFactory,随时实例化EntityManager: EntityManagerFactory emf = Persistence.createEntityManagerFactory(schemaToChoose); EntityManager em = emf.createEntityManager(); 而且效果很好。但因此,我不使用容器注入 现在,我想知道这样
EntityManagerFactory emf = Persistence.createEntityManagerFactory(schemaToChoose);
EntityManager em = emf.createEntityManager();
而且效果很好。但因此,我不使用容器注入
现在,我想知道这样做是否会花费太多的资源
我可能不太了解JPA缓存,但我相信实体存储在em缓存和emf缓存中,有两个级别。所以,当我每次实例化em和emf时,我可能会丢失JPA缓存,因此,我每次都会重新创建它
我有两个问题:emf和em每次都会影响性能吗?我应该注入尽可能多的em模式来保留缓存吗
谢谢EntityManagerFactory是一个重量级的、渴望创建的对象。它应该只创建一次,然后重新使用。实际上,每次创建它时,它都会解析persistence.xml文件,计算每个实体的映射元数据,等等 如果您在JavaEE容器中运行,那么您肯定应该让容器为您实例化它,并在EJB中注入实体管理器 我发现一个应用程序使用多个数据库Shema很奇怪。为什么会这样
关于缓存:有一个与实体管理器关联的一级缓存(这是一个短期缓存,通常与事务具有相同的生命周期。也可以有一个与实体管理器工厂关联的二级缓存,但默认情况下这是关闭的,如果启用,必须仅用于某些实体并小心配置。您基本上有一个多租户模式。EJB注入处理得不太好
EntityManagerFactory不是您想要多次创建的东西,它确实包含共享缓存。(共享缓存默认值不是由JPA指定的,它在EclipseLink中默认为打开,但可以通过JPA缓存模式和@Cacheable和@cache进行配置) 我会为你们的工厂推荐某种注册,也许这甚至是一个应用程序对象,比如你们的宇宙
public class Universe {
static Map<String, Universe> universes;
EntityManagerFactory emf;
public static Universe getUniverse(String schema) {
... hopefully you get the idea ...
}
public EntityManagerFactory getEntityManagerFactory() {
return emf;
}
}
公共类宇宙{
静态地图宇宙;
实体管理工厂emf;
公共静态宇宙getUniverse(字符串模式){
…希望你能明白。。。
}
公共EntityManagerFactory getEntityManagerFactory(){
返回电动势;
}
}
另外,我建议您研究EclipseLink的多租户支持
您好。我选择了1个DB和多个模式,而不是为我的应用程序使用多个DB和每个DB一个模式……这几乎是任意的选择……所以您建议我注入所有EMs,而不是在运行时手动实例化它们?拥有多个DB会更奇怪。为什么您的应用程序使用多个模式而不是一个模式?我的应用程序如果你知道这个游戏的话,它将是一个游戏应用程序,就像Ogame一样。所以我必须通过shema或DB数据进行分区,因为用户将在一个宇宙或另一个宇宙中注册。所以,我的游戏的两个玩家不必在同一个宇宙中。所以,这意味着你将在宇宙表中有两行。我不明白为什么你需要两个方案关于这一点。如果有1000个Universe,就不会创建1000个模式和1000个实体管理器工厂。我不希望只有1个DB和1个模式,因为Universe将是非常异构的。此外,出于备份和管理原因,我希望在Universe之间分离数据。