我们正在使用JPA在glassfish v3.0.1上运行的应用程序中将实体持久化并合并到Oracle 11g数据库中
当查询花费太长时间完成或提交时,我们一直在尝试关闭会话。但是会话仍在数据库中打开。
这是执行查询并尝试关闭所有内容的线程。
private class PRunnable implements Runnable {
MyEntity myEntity;
public PRunnable(MyEntity myEntity) {
this.myEntity = myEntity;
}
@Override
public void run() {
final EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Runnable r = new Runnable() {
@Override
public void run() {
try {
//It can get stuck in the merge or committing
em.merge(myEntity);
em.flush();
em.getTransaction().commit();
} catch (Exception e) {
em.getTransaction().rollback();
} finally {
em.clear();
em.close();
}
}
};
Thread t = new Thread(r);
t.start();
try {
t.join(500);
} catch (Exception e) {
//It's never getting here
}
if (t.isAlive()) {
//If the query takes to long it successfully closes the em
em.clear();
em.close();
}
}
}
我们也尝试过: (em.unwrap(JpaEntityManager.class).getServerSession())断开(); (em.unwrap(java.sql.Connection.class))接近();
但db会话总是活着的。
您知道在数据库上成功关闭会话的方法吗?
答案 0 :(得分:2)
在JPA 1中,您应该在DataSource
配置中指定连接超时。
在JPA 2(您正在使用)中,有一个标准属性:javax.persistence.query.timeout