Подтвердить что ты не робот

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, похоже, не освобождает соединение с пулом. Пожалуйста, дайте мне знать, если вам нужны подробности.

4b9b3361

Ответ 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 при завершении транзакций.