关闭jpa entitymanager与保持开放的价值

时间:2012-11-27 21:42:19

标签: sqlite jpa entitymanager

我遇到了一个问题,如果我尝试关闭实体管理器,然后再次打开它,我的sqlite数据库就会锁定:

Caused by: java.sql.SQLException: database is locked
        at org.sqlite.DB.throwex(DB.java:370)
        at org.sqlite.DB.exec(DB.java:76)

但是,如果我只是让实体经理打开,我就不会看到错误。所以我的问题是,我真的需要关闭吗?如果这是唯一将使用此数据库的应用程序,那么它是否需要关闭它会有什么影响呢?

以下是我创建的两种方法。我正在调用initTransaction(),然后持久化我的对象并提交,然后调用endTransaction()。第二次我尝试在tx.commit()上发生错误。

    private EntityManagerFactory emf;
    private EntityManager em;
    private EntityTransaction tx; 

    //in my Java backing bean, multiple methods
        initTransaction();
        em.persist(someObject);
        tx.commit(); //Exception thrown here, but OK first time thru
        endTransaction();        

    private synchronized void initTransaction() {
      if (emf == null || !emf.isOpen()) { emf = Persistence.createEntityManagerFactory("persistenceUnitSqlite"); };   
      if (em == null || !em.isOpen()) { em = emf.createEntityManager(); }
      tx = em.getTransaction();
      if (!tx.isActive()) { tx.begin(); }
    }        

    private synchronized void endTransaction() {
      if (em != null) { em.clear(); em.close(); }
      if (emf != null) { emf.close(); }
      tx = null;
    }

1 个答案:

答案 0 :(得分:1)

是的,您需要关闭EntityManager。 EntityManagerFactory通常不应该关闭,它应该作为单例保存在静态变量中。