我遇到了一个问题,如果我尝试关闭实体管理器,然后再次打开它,我的 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;
}