У меня тоже была эта проблема!
Я использую транзакцию аннотации Spring (@Transactional) и получаю какой-то метод, выполняющий session.flush (), а другой нет!
Из моего журнала отладки у меня есть:
transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
session.close () должен вызываться из Spring TransationManager, но я не уверен, что происходит: я дважды проверил свою конфигурацию Spring и не могу утверждать, почему это происходит. Я продолжаю расследование и буду публиковать любые подсказки, но если у кого-то будет полезный совет, я буду очень признателен: o)
Обновление: похоже, проблема связана с режимом очистки сеанса спящего режима = РУЧНОЙ: он не сбрасывал объекты в конце транзакции Spring.
Вы можете проверить свой текущий режим сброса с помощью чего-то вроде:
SessionFactoryUtils.getSession(mySessionFactory(), false).getCurrentSession().getFlushMode()
ОБНОВЛЕНИЕ [РЕШЕНО ДЛЯ МЕНЯ]:
Я много покопался в своей проблеме и нашел причину проблемы и обходной путь.
У меня, как вы понимаете, была непостоянная проблема, когда некоторые транзакции были закрыты правильно (т.е. сеансы гибернации были сброшены), а некоторые другие нет.
Я обнаружил, что:
проблема возникла из-за того, что flushMode
был установлен на FlushMode.MANUAL
, когда я вошел в транзакцию (что не вызывает операцию сброса при фиксации транзакции);
это, в свою очередь, произошло из-за чего-то неприятного между Spring и ZK (все плохие транзакции были от композиторов ZK - если вы не знаете ZK, они вызываются из сервлетов, что примерно эквивалентно действиям Struts );
точная проблема заключается в том, что OpenSessionInViewFilter
Spring неправильно взаимодействует с фильтрами ZK: сеанс Hibernate, предоставляемый OpenSessionInViewFilter
, не получает корректно установленный режим сброса. Хорошо работает один ZK composer (я тестировал его из некоторых тестов JUnit), а также один OpenSessionInViewFilter
(я тестировал его с простого сервлета, используя WebApplicationContextUtils
).
Заключение: я вызываю session.flush()
в конце каждого метода @Transactional в моих композиторах, и я перейду на Vaadin (гораздо проще интегрировать, кажется).