2010-10-13 3 views
12

Мое приложение имеет длительные транзакции и, следовательно, я попробовал параметр session.close() в конце каждого метода, чтобы гарантировать, что объекты соединения не будут храниться бесконечно долгое время ,Hibernate 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, похоже, не отключает соединение с пулом. Пожалуйста, дайте мне знать, если вам нужны подробности.

+0

Вы должны предоставить более подробную информацию о конфигурации. например, какая транзакционная менеджер и конфигурация транзакций, как вы управляете своими транзакциями и т. д. – Salandur

ответ

0

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

+0

Привет, спасибо за ваш ответ. Мы используем Weblogic Transaction Manager (org.hibernate.transaction. WeblogicTransactionManagerLookup) и JTATransactionFactory. Операция управляется контейнером, который заботится о объекте соединения. При использовании CMT невозможно ли программно вернуть соединение с пулом соединений, закрыв сеанс спящего режима? – Perfuser123

+0

В этом случае weblogic добавляет подключение к транзакции. когда транзакция закончится, weblogic вернет соединение с пулом – Salandur

+0

Да, он возвращает соединение с пулом после завершения транзакции путем фиксации или откат. Но внутри транзакции у меня есть вызовы для внешних приложений, для выполнения которых требуется больше времени. Я пытаюсь закрыть соединение и вернуть его в пул непосредственно перед вызовом длинных методов и снова подключиться, если потребуется. Таким образом, я не буду долго удерживать соединение. Скажите, пожалуйста, если это возможно. Могу ли я вернуть соединение с пулом с помощью session.close или отключить внутри долговременной транзакции? – Perfuser123

19

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

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

Для справки, вот что Table 3.4. Hibernate JDBC and Connection Properties пишет о собственности hibernate.connection.release_mode:

Указывает, когда Hibernate должен релиз JDBC соединения. По умолчанию соединение JDBC удерживается до тех пор, пока сеанс не будет явно закрыт или отключен. Для приложения сервер JTA datasource, используйте after_statement для агрессивно выпустить соединения после каждого вызова JDBC . Для не-JTA-соединения часто имеет смысл освободить соединение в конце каждой операции , используя after_transaction. auto будет выбрать after_statement для JTA и стратегии транзакций CMT и after_transaction для JDBC стратегия транзакции.

, например.auto (default) | on_close | after_transaction | after_statement

Этот параметр влияет только на Сессии вернулся из SessionFactory.openSession. Для сессий получены через SessionFactory.getCurrentSession, то реализация CurrentSessionContext сконфигурирован для использования управляет режимом освобождения соединения для этих сессий. См Section 2.5, “Contextual sessions”

Если это не помогает, пожалуйста, добавить больше информации о среде и конфигурации (Spring?), Как вы получите сеанс и т.д.

+0

Это мои Hibernate сведения о файле конфигурации: <имя свойства = «connection.datasource»> MXoraDS <Свойство Имя = «диалектов»> org.hibernate.dialect.Oracle9Dialect <недвижимость Name = "connection.release_mode"> after_statement <свойство имя = "hibernate.transaction.manager_lookup_class"> org.hibernate.transaction.WeblogicTransactionManagerLookup имя <свойство = "hibernate.transaction.factory_class"> org.hibernate.transaction .JTATransactionFactory – Perfuser123

+0

Дополнительная информация: org.h ibernate.context.JTASessionContext <имя свойства = "transaction.auto_close_session"> истинно <имя свойства = "max_fetch_depth"> 2 Мы используем JSF и EJB 2.1 на уровне приложений, подключенного к БД Oracle. Функция after_statement, похоже, не освобождает соединение с пулом. Пожалуйста, дайте мне знать, если вам нужны подробности. – Perfuser123

Смежные вопросы