Вопрос

Ниже приведены детали конфигурации:

<property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.Oracle9iDialect
    </prop>
    <prop key="hibernate.show_sql">false</prop>
    <prop key="hibernate.cache.provider_class">
     org.hibernate.cache.OSCacheProvider
    </prop>
    <prop key="hibernate.cache.use_second_level_cache">
     true
    </prop>
    <!-- <prop key="hibernate.hbm2ddl.auto">update</prop>-->
    <!-- HIBERNATE CONNECTION POOLING!!-->
    <prop key="c3p0.acquire_increment">5</prop>
    <prop key="c3p0.idle_test_period">100</prop>
    <!-- seconds -->    
    <prop key="c3p0.max_statements">5</prop>
    <prop key="c3p0.min_size">15</prop>
                            <prop key="c3p0.max_size">100</prop> 
    <prop key="c3p0.timeout">100</prop>
    <!-- seconds -->
   </props>
  </property>

Наше приложение разработано с помощью Spring & Hibernate.

Как только мы запускаем приложение и запускаем его, оно открывает 140 соединений и не освобождает его.

Наш DAO выглядит так:

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
...
public class ActionDAO extends HibernateDaoSupport implements IActionDAO {
 public Action findById(ActionPK actionPK) {
  return (Action) getHibernateTemplate().get(Action.class, actionPK);
 }

 public void add(Action action) {
  getHibernateTemplate().save(action);
 }
}
Это было полезно?

Решение

Некоторое время назад у нас возникла аналогичная проблема, и основная причина заключалась в том, что фабрика сеансов Hibernate не была закрыта до закрытия приложения.Хотя я понимаю, что вы используете Spring, который должен позаботиться об этом автоматически, тем не менее, возможно, стоит проверить.

Другие советы

Являются ли ваши сеансы частью транзакции?Если да, то закрытие сеанса/соединения может произойти только после завершения транзакции, а если этого не произойдет, вы получите утечку соединений.

Включение ведения журнала отладки на org.hibernate.jdbc и org.hibernate.transaction может помочь...также посмотрите класс HibernateTemplate (который использует HibernateDaoSupport) и посмотрите параметры настройки создания/закрытия сеанса.Возможно, вы просто захотите поместить свои объекты DAO в оболочку транзакции Spring или что-то подобное.

Я не думаю, что ваши настройки c3p0 нарушены, поскольку у вас соединения > 100 дБ.При этом вам следует установить для параметраdleid_test_ period значение меньше, чем тайм-аут c3p0.

Кроме того, какая версия спящего режима имеет значение при определении того, почему c3p0 не используется.

Вы также упомянули весну;вам нужно видеть, что вы делаете в отношении транзакций.Есть ли у вас какой-то сервис или что-то, что есть или, в вашем случае, не включает использование DAO в транзакцию?

Если вы используете Spring autowiring и hibernateTemplate

убедитесь, что вы не создаете более одного экземпляра HibernateTemplate, т.е.

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/applicationContext.xml");
Object o=context.getBean("hibernateTemplate");

Объект o должен быть где-то кэширован и возвращен, когда код вашего приложения запрашивает экземпляр hibernatetemplate.

Спасибо

Удалите минимальный размер и попробуйте:c3p0.min_size

У меня была аналогичная проблема в Jboss-hibernate.У нас сложилось впечатление, что во время выполнения читать при работе в рамках транзакционного сеанса не было необходимости фиксировать транзакцию.Однако мы поняли, что транзакция должен быть совершено, хотя это всего лишь читать операция (если вы начали транзакцию).Как только мы зафиксировали транзакцию повсюду, утечка исчезла.

Код ошибки был таким:

  1. Начать транзакцию
  2. Выполнить операцию чтения
  3. Закрыть сеанс

Вышеописанное было заменено следующей процедурой, и утечка исчезла.

  1. Начало транзакции
  2. Выполнить операцию чтения
  3. Зафиксировать транзакцию
  4. Закрыть сеанс
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top