Hibernate session.close () не возвращает соединение с пулом - PullRequest
14 голосов
/ 13 октября 2010

Мое приложение имеет долго выполняющиеся транзакции, и поэтому я пытался использовать опцию session.close () в конце каждого метода, чтобы гарантировать, что объекты соединения не будут храниться бесконечно долгое время.

Когда используется опция session.close (), я могу видеть, что объект сеанса Hibernate и соответствующий объект Connection, полученный из session.connection (), уничтожаются правильно. Но проблема в пуле соединений. Соединение, полученное сеансом, не освобождается обратно в пул соединений даже после закрытия сеанса. Другие запросы ожидают подключения из пула.

Я использую транзакцию JTA в своем приложении. В hibernate.cfg.xml я установил для connection.release_mode значение auto (по умолчанию) и для connection.autocommit значение true.

Кто-нибудь сталкивался с этой проблемой? Пожалуйста, дайте мне знать, что мне здесь не хватает.

Продолжение: Это мой файл конфигурации Hibernate:

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

Ответы [ 2 ]

20 голосов
/ 14 октября 2010

Я использую транзакцию JTA в своем приложении.В hibernate.cfg.xml я установил для connection.release_mode значение auto (по умолчанию) и для connection.autocommit значение true.

Не могли бы вы попытаться явно определить свойство hibernate.connection.release_mode для after_statement?Я знаю, что это должно быть по умолчанию, но, в зависимости от вашего контекста (вы могли бы использовать Spring?), auto может работать не так, как ожидалось (см. здесь и здесь ).

Для справки, вот что Таблица 3.4.Свойства JDBC и подключения Hibernate пишет о свойстве 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?), Как вы получаете сеанс,и т.д.

0 голосов
/ 13 октября 2010

если вы используете JDBCTransactionManager, соединение будет возвращено в пул соединений после завершения транзакций.

...