Hibernate Session Закрытое Исключение после быстрых последующих запросов - PullRequest
1 голос
/ 07 ноября 2011

Я получаю ошибку Caused by: org.hibernate.SessionException: Session is closed!, когда нажимаю на ссылку перед загрузкой всей страницы (или, по-моему, только внутри активного сеанса гибернации).

Все мои классы DAO имеют подклассы GenericDAO где я получил этот метод:

public Session getSession() {
    if (session == null || !session.isOpen()) {
        session = HibernateUtil.getSessionFactory().getCurrentSession();
    }
    return session;
}

Это вызывается из:

public void beginTransaction() {
    transaction = getSession().beginTransaction();
}

и, наконец, совершено:

public void commit() {
    if (transaction != null)
        transaction.commit();
    transaction = null;
    session = null;
}

Я что-то здесь упускаю?

1 Ответ

6 голосов
/ 07 ноября 2011

Похоже, вы используете один экземпляр вашего DAO для всех запросов. Однако ваш DAO пытается сохранить текущий Session в своем поле, поэтому он не может обрабатывать параллельные запросы. Обратите внимание, что Session не является потокобезопасным, и вы должны использовать разные Session s для разных запросов.

На самом деле, ваша сложная логика в методе getSession() не нужна. Когда вам нужен текущий Session в вашем DAO, вы можете просто написать sessionFactory.getCurrentSession(). Пока Hibernate правильно настроен (см. 2.3. Контекстные сеансы ), он будет возвращать правильный экземпляр текущего сеанса, и ваш DAO сможет обслуживать параллельные запросы.

...