Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
Sqlite 关闭jpa entitymanager与保持其打开的价值_Sqlite_Jpa_Entitymanager - Fatal编程技术网

Sqlite 关闭jpa entitymanager与保持其打开的价值

Sqlite 关闭jpa entitymanager与保持其打开的价值,sqlite,jpa,entitymanager,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) 但是如果我只是让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)
但是如果我只是让entitymanager保持打开状态,我看不到错误。所以我的问题是,我真的需要关闭它吗?如果这是唯一一个将使用此数据库的应用程序,那么是否需要关闭它会有区别吗

下面是我创建的两个方法。我调用initTransaction(),然后持久化我的对象并提交,然后调用endTransaction()。在我第二次尝试执行此操作时,在tx.commit()上会出现此错误


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

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

谢谢您的回答。我对它做了更多的研究,现在我明白了工厂对象应该只创建一次。来自JBoss文档:“EntityManagerFactory是一个创建线程安全对象的昂贵工具,所有应用程序线程都要共享它。它只创建一次,通常是在应用程序启动时创建的。我也知道EntityManager是数据的“缓存”,但我仍然不知道应该在什么时候关闭或保持打开。谢谢你的回答。我对它做了更多的研究,现在我明白了工厂对象应该只创建一次。来自JBoss文档:“EntityManagerFactory是一个创建线程安全对象的昂贵工具,所有应用程序线程都要共享它。通常在应用程序启动时创建一次。我也知道EntityManager是数据的“缓存”,但我仍然不知道应该在什么时候关闭或保持打开。
    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;
    }