Закрытие сеанса БД, если запрос JPA занимает слишком много времени - PullRequest
0 голосов
/ 31 марта 2011

Мы используем 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)) близко ();.

Но сессия БД всегда жива.

Знаете ли вы, как успешно закрыть сеанс в базе данных?

1 Ответ

2 голосов
/ 31 марта 2011

В JPA 1 вы должны указать время ожидания соединения в вашей конфигурации DataSource.

В JPA 2 (который вы используете) есть стандартное свойство: javax.persistence.query.timeout

...