如果JPA查询花费太长时间,则关闭数据库会话

时间:2011-03-31 11:12:11

标签: java oracle jpa eclipselink

我们正在使用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会话总是活着的。

您知道在数据库上成功关闭会话的方法吗?

1 个答案:

答案 0 :(得分:2)

在JPA 1中,您应该在DataSource配置中指定连接超时。

在JPA 2(您正在使用)中,有一个标准属性:javax.persistence.query.timeout