Java 如果JPA查询耗时过长,则关闭db会话
我们正在glassfish v3.0.1上运行的应用程序中使用JPA将实体持久化并合并到Oracle 11g数据库中 我们一直试图在查询完成或提交时间过长时关闭会话。但该会话仍在数据库中打开 这是执行查询并尝试关闭所有内容的线程Java 如果JPA查询耗时过长,则关闭db会话,java,oracle,jpa,eclipselink,Java,Oracle,Jpa,Eclipselink,我们正在glassfish v3.0.1上运行的应用程序中使用JPA将实体持久化并合并到Oracle 11g数据库中 我们一直试图在查询完成或提交时间过长时关闭会话。但该会话仍在数据库中打开 这是执行查询并尝试关闭所有内容的线程 private class PRunnable implements Runnable { MyEntity myEntity; public PRunnable(MyEntity myEntity) { this.myEntity
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()).disconnect();
(em.unwrap(java.sql.Connection.class)).close()
但是db会话始终处于活动状态
您知道如何成功关闭数据库上的会话吗?在JPA 1中,您应该在
数据源
配置中指定连接超时
在JPA2(您正在使用的)中有一个标准属性:
javax.persistence.query.timeout
您好,谢谢您的回答。我试过:eclipseelink.jdbc.timeout
,javax.persistence.query.timeout
和javax.persistence.lock.timeout
,但这些似乎都不起作用。我还有别的地方可以试试吗?@olgadg发生了什么事?查询只是继续而没有超时?我错了,时间是秒,不是毫秒。成功了。非常感谢。