Hibernate не выпускает соединения с базой данных - PullRequest
1 голос
/ 19 марта 2010

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

<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);
 }
}

Ответы [ 6 ]

2 голосов
/ 20 марта 2010

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

1 голос
/ 19 марта 2010

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

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

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

1 голос
/ 19 марта 2010

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

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

0 голосов
/ 04 июня 2015

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

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

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

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

  1. Начало транзакции
  2. Выполнение операции чтения
  3. совершить транзакцию
  4. закрыть сеанс
0 голосов
/ 07 ноября 2013

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

0 голосов
/ 21 июня 2011

Если вы используете пружинную автопроводку и hibernateTemplate

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

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

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

Спасибо

...