1

エンティティマネージャーを閉じてからもう一度開くと、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を開いたままにしておくと、エラーは表示されません。だから私の質問は、私は本当にそれを閉じる必要がありますか?これがこのデータベースを使用する唯一のアプリケーションである場合、データベースを閉じる必要があるかどうかに違いはありますか?

これが私が作成した2つのメソッドです。私はinitTransaction()を呼び出し、次にオブジェクトを永続化してコミットし、次にendTransaction()を呼び出していました。このエラーは、tx.commit()で2回目にこれを実行しようとしたときに発生します。

    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;
    }
4

1 に答える 1

1

はい、EntityManager を閉じる必要があります。EntityManagerFactory は通常は閉じてはならず、静的変数にシングルトンとして保持する必要があります。

于 2012-11-28T14:52:55.397 に答える