Hibernate session.close() не возвращает соединение с пулом
Мое приложение имеет длительные транзакции и, следовательно, я попробовал параметр session.close() в конце каждого метода, чтобы гарантировать, что объекты соединения не будут храниться неопределенно долгое время.
Когда используется параметр session.close(), я мог видеть, что объект сеанса Hibernate и соответствующий объект Connection, полученный из session.connection(), были уничтожены правильно. Но проблема связана с пулом соединений. Соединение, полученное сеансом, не возвращается обратно в пул соединений даже после закрытия сеанса. Другие запросы находятся в ожидании подключения из пула.
Я использую транзакцию JTA в своем приложении. В hibernate.cfg.xml я установил connection.release_mode в auto (по умолчанию) и connection.autocommit в true.
Кто-нибудь сталкивался с этой проблемой? Пожалуйста, дайте мне знать, что мне здесь не хватает.
Последующее наблюдение: Это мой конфигурационный файл спящего режима:
<property name="connection.datasource">MXoraDS</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.release_mode">after_statement</property>
<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="hibernate.current_session_context_class">org.hibernate.context.JTASessionContext</property>
<property name="transaction.auto_close_session">true</property>
<property name="max_fetch_depth">2</property>
Мы используем JSF и EJB 2.1 на уровне приложения, подключающемся к Oracle DB. after_statement
, похоже, не освобождает соединение с пулом. Пожалуйста, дайте мне знать, если вам нужны подробности.
Ответы
Ответ 1
Я использую транзакцию JTA в своем приложении. В hibernate.cfg.xml я установил connection.release_mode в auto (по умолчанию) и connection.autocommit в true.
Не можете ли вы явно определить свойство hibernate.connection.release_mode
для after_statement
? Я знаю, что это должно быть по умолчанию, но, в зависимости от вашего контекста (вы могли бы использовать Spring?), auto
может не работать должным образом (см. здесь и здесь).
Для справки, вот что Таблица 3.4. Hibernate JDBC и Свойства подключения записывает свойство hibernate.connection.release_mode
:
Указывает, когда Hibernate должен освободить соединения JDBC. По умолчанию, соединение JDBC сохраняется до тех пор, пока сеанс явно закрыт или отсоединен. Для приложения сервер JTA, использовать after_statement
, чтобы агрессивно освобождать соединения после каждого JDBC вызов.. Для не-JTA-соединения это часто имеет смысл освободить соединение в конце каждого транзакции, используя after_transaction
. auto
будет выберите after_statement
для JTA и стратегии транзакций CMT и after_transaction
для JDBC стратегия транзакций.
, например auto
(по умолчанию) | on_close
| after_transaction
| after_statement
Этот параметр влияет только на сеансы вернулся из SessionFactory.openSession
. Для Сессии, полученные через SessionFactory.getCurrentSession
, CurrentSessionContext
реализация настроенный для использования, управляет режим освобождения соединения для этих Сессии. См. Раздел 2.5, "Контекстные сеансы"
Если это не поможет, добавьте более подробную информацию о своей среде и конфигурации (Spring?), о том, как вы получите сеанс и т.д.
Ответ 2
если вы используете JDBCTransactionManager, соединение будет возвращено в connectionpool при завершении транзакций.