什么时候应该创建/打开 EntityManagerFactory 实例? [英] When should EntityManagerFactory instance be created/opened?

查看:26
本文介绍了什么时候应该创建/打开 EntityManagerFactory 实例?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,我阅读了大量关于如何在单例中编写实体管理器工厂的文章/示例.

Ok, I read bunch of articles/examples how to write Entity Manager Factory in singleton.

其中一个对我来说最容易理解:

One of them easiest for me to understand a bit:

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

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

并且还要确保在使用后关闭 EMF (?)

And also make sure to close the EMF once it's used (?)

所以我写了 EMF 辅助类来使用业务方法:

So I wrote EMF helper class for business methods to use:

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 必须是单例如此糟糕???我阅读了并发问题,但由于我没有使用过多线程语法,因此我不太清楚这个想法.

I made sure to close EntityManager (em) within method level as suggested. But when should EntityManagerFactory be closed then? And why EMF has to be singleton so bad??? I read about concurrency issues but as I am not experienced multi-thread-grammer, I can't really be clear on this idea.

推荐答案

  • EntityManagerFactory 实例是重量级的物体.每个工厂可能会维护一个元数据缓存,对象状态缓存,EntityManager池、连接池等.如果您的应用程序不再需要EntityManagerFactory,你应该关闭它以释放这些资源.

    • EntityManagerFactory instances are heavyweight objects. Each factory might maintain a metadata cache, object state cache, EntityManager pool, connection pool, and more. If your application no longer needs an EntityManagerFactory, you should close it to free these resources.

      当 EntityManagerFactory 关闭时,该工厂的所有 EntityManagers,并通过扩展所有实体管理通过那些 EntityManagers,成为无效.

      When an EntityManagerFactory closes, all EntityManagers from that factory, and by extension all entities managed by those EntityManagers, become invalid.

      保留工厂要好得多比打开很长一段时间反复创建和关闭新的工厂.因此,大多数应用永远不会关闭工厂,或者只会当应用程序关闭时关闭它退出.

      It is much better to keep a factory open for a long period of time than to repeatedly create and close new factories. Thus, most applications will never close the factory, or only close it when the application is exiting.

      只有需要的应用程序多个工厂有不同的配置有一个明显的原因创建和关闭多个EntityManagerFactory 实例.

      Only applications that require multiple factories with different configurations have an obvious reason to create and close multiple EntityManagerFactory instances.

      只有一个 EntityManagerFactory 是允许为每个创建部署的持久性单元配置.任意数量EntityManager 实例可能是从给定的工厂创建.

      Only one EntityManagerFactory is permitted to be created for each deployed persistence unit configuration. Any number of EntityManager instances may be created from a given factory.

      这篇关于什么时候应该创建/打开 EntityManagerFactory 实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆