1
我遇到了一個問題:如果我試圖關閉實體管理器,然後打開開了一遍,我的SQLite數據庫被鎖定:值關閉的JPA EntityManager,對保持它打開
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()上執行此操作時會發生錯誤。
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;
}
感謝您的回答。我已經做了一些更深入的研究,現在我明白工廠對象應該只創建一次。從JBoss文檔:'EntityManagerFactory是一個代價高昂的線程安全對象,旨在被所有應用程序線程共享。它通常在應用程序啓動時創建一次。「 – MattC
我也知道EntityManager是數據的「緩存」,但我仍然不明白你什麼時候應該關閉它或保持打開狀態。 – MattC