Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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/4/regex/17.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缓存_Java_Caching_Jpa - Fatal编程技术网

Java 处理JPA缓存

Java 处理JPA缓存,java,caching,jpa,Java,Caching,Jpa,我的persistence.xml中有许多持久性单元,一个是postgreSQL模式 我通过动态创建EntityManagerFactory,随时实例化EntityManager: EntityManagerFactory emf = Persistence.createEntityManagerFactory(schemaToChoose); EntityManager em = emf.createEntityManager(); 而且效果很好。但因此,我不使用容器注入 现在,我想知道这样

我的persistence.xml中有许多持久性单元,一个是postgreSQL模式

我通过动态创建EntityManagerFactory,随时实例化EntityManager:

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之间分离数据。