Получение нового сеанса из Hibernate для фонового потока - PullRequest
5 голосов
/ 25 февраля 2010

Я работаю над веб-приложением. Обычно в начале запроса (через код архитектуры) открывается сеанс Hibernate для работы с транзакциями БД. По окончании запроса сессия закрывается. Это прекрасно работает для всех наших транзакций, за исключением того, что в одном конкретном случае я хочу запустить поток из запроса. Этот поток будет вызывать транзакции БД.

Из потока я вызываю "sessionFactory.openSession ()", и в этом сеансе я выполняю свои транзакции. Проблема возникает в том, что когда запрос завершается, сам поток не обязательно завершается. Поэтому, когда запрос заканчивается, и поток пытается выполнить другую транзакцию БД, я получаю, что Hibernate Session закрыт! ошибка.

Есть ли в любом случае, что из моего потока я могу открыть "чистый" сеанс, не связанный с тем, который был открыт в начале запроса?

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

Вы можете создать службу потоков, которая расширяет HibernateAccessor, как отдельную службу Spring, определенную в spring.xml, и отправить ей код / ​​данные, которые вы хотите обработать. Примерно так:

    Session session = SessionFactoryUtils.getSession(
            getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
    SessionHolder sessionHolder = null;
    try {
        applyFlushMode(session, false);
        sessionHolder = new SessionHolder(session);
        TransactionSynchronizationManager.bindResource(getSessionFactory(), sessionHolder);
        Transaction t = getSessionFactory().getCurrentSession().beginTransaction();
        try {

            //execute your code here

            t.commit();
        } catch (Exception e) {
            t.rollback();
            log.error("Error", e);
        }
        try {
            flushIfNecessary(sessionHolder.getSession(), false);
        }
        catch (HibernateException ex) {
            throw convertHibernateAccessException(ex);
        }
    } finally {
        SessionFactoryUtils.closeSession(sessionHolder.getSession());
        TransactionSynchronizationManager.unbindResource(getSessionFactory());
    }
0 голосов
/ 23 февраля 2018

Вы можете использовать JPA Entity Manager для запуска и фиксации транзакций вручную. Вот мой расширенный ответ

...