当前位置: 首页 > 面试题库 >

何时应创建/打开EntityManagerFactory实例?

壤驷宏才
2023-03-14
问题内容

好的,我读了许多文章/示例,这些内容/示例如何以单例形式编写Entity Manager Factory。

我最容易理解的其中一个:

http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-
web.html

我了解到 最好仅在应用程序范围内创建一次EntityManagerFactory(EMF)。

并确保在使用完EMF后将其关闭(?)

因此,我编写了EMF帮助程序类以供使用的业务方法:

public class EmProvider {

    private static final String DB_PU = "KogaAlphaPU";

    public static final boolean DEBUG = true;

    private static final EmProvider singleton = new EmProvider();

    private EntityManagerFactory emf;

    private EmProvider() {}

    public static EmProvider getInstance() {
        return singleton;
    }


    public EntityManagerFactory getEntityManagerFactory() {
        if(emf == null) {
            emf = Persistence.createEntityManagerFactory(DB_PU);
        }
        if(DEBUG) {
            System.out.println("factory created on: " + new Date());
        }
        return emf;
    }

    public void closeEmf() {
        if(emf.isOpen() || emf != null) {
            emf.close();
        }
        emf = null;
        if(DEBUG) {
            System.out.println("EMF closed at: " + new Date());
        }
    }

}//end class

而我使用EmProvider的方法:

public String foo() {
    EntityManager em = null;
    List<Object[]> out = null;
    try {

        em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
        Query query = em.createNativeQuery(JPQL_JOIN); //just some random query 
        out = query.getResultList();
    }
    catch(Exception e) {
        //handle error....
    }
    finally {
        if(em != null) {
             em.close(); //make sure to close EntityManager
        }
        //should I not close the EMF itself here?????
        EmProvider.getInstance().closeEmf();
    }

我确保按照建议在方法级别内关闭EntityManager(em)。但是, 什么时候应该关闭EntityManagerFactory呢?
以及为什么EMF必须如此单调?我阅读了有关并发问题的文章,但是由于我没有多线程语法的经验,因此我对这个想法并不十分清楚。


问题答案:
  • EntityManagerFactory实例是重量级对象。每个工厂可能维护一个元数据缓存,对象状态缓存,EntityManager池,连接池等。如果您的应用程序不再需要EntityManagerFactory,则应将其关闭以释放这些资源。

  • 当EntityManagerFactory关闭时,该工厂中的所有EntityManager以及由这些EntityManager管理的所有实体都将变为无效。

  • 保持工厂长时间开放比重复创建和关闭新工厂要好得多。因此,大多数应用程序永远不会关闭工厂,或者仅在应用程序退出时关闭工厂。

  • 只有需要具有不同配置的多个工厂的应用程序才有明显的理由来创建和关闭多个EntityManagerFactory实例。

  • 对于每个部署的持久性单元配置,只允许创建一个EntityManagerFactory。可以从给定的工厂创建任意数量的EntityManager实例。

  • JVM中可能同时有多个实体管理器工厂实例。EntityManagerFactory接口的方法是线程安全的。



 类似资料:
  • 现在我正在尝试用spring MVC配置jpa数据。但是我在tomcat服务器上尝试执行时遇到了异常。 有人能指导我解决这个吗?谢谢

  • 我为应用程序创建了以下测试: Jenkins不能执行我的测试有什么问题?

  • 在我的Spring应用程序中,我有这些问题。有人能帮我吗? 我在pom.xml上添加了一些东西,但是应用程序没有启动,有很多错误。 启动应用程序上下文时出错。若要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2019-01-26 14:58:17.003 错误 14580 --- [ 重新启动主屏幕] o.s.boot.Spring 应用程序: 应用程序运行失败

  • 我有一个数据库配置类来连接我的Spring网络服务和数据库。我正在使用Spring引导,使它成为独立的应用程序。 这是我的课 每次我尝试运行我的代码,它都会抛出异常: 据我所知,有一个缺失的依赖项,但我不知道是哪个。或者问题是别的什么?这是我在pom.xml的依赖项 你知道问题的原因和解决方法吗?

  • 问题内容: 我想要一个在应用启动时打开的滑块。它将通过按钮等打开,并且当用户关闭它时,将有更多按钮可供访问。滑动抽屉可以吗?我会在onCreate()方法中添加什么? 谢谢 问题答案: XML布局-在基本的LinearLayout中: 您的活动将如下所示:

  • 我的Netbeans直到今天都工作得很好。但是今天早上,当尝试打开net beans时,它给出了JVM创建失败的消息。