2012-11-27 55 views
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; 
    } 

回答

1

是的,您需要關閉EntityManager。 EntityManagerFactory通常不應該被關閉,它應該作爲一個單體被保存在一個靜態變量中。

+0

感謝您的回答。我已經做了一些更深入的研究,現在我明白工廠對象應該只創建一次。從JBoss文檔:'EntityManagerFactory是一個代價高昂的線程安全對象,旨在被所有應用程序線程共享。它通常在應用程序啓動時創建一次。「 – MattC

+0

我也知道EntityManager是數據的「緩存」,但我仍然不明白你什麼時候應該關閉它或保持打開狀態。 – MattC