Мы используем JPA для сохранения и объединения сущностей в Oracle 11g db в приложении, работающем на glassfish v3.0.1
Мы пытались закрыть сеанс, когда запрос занимает слишком много времени, чтобы завершить или зафиксировать. Но сессия все еще открыта в базе данных.
Это поток, который выполняет запрос и пытается закрыть все.
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)) близко ();.
Но сессия БД всегда жива.
Знаете ли вы, как успешно закрыть сеанс в базе данных?