2010-03-19 1 views
1

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

<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 & гибернации.

Как только мы приносим приложение и ударяем его, он открывает 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); 
} 
} 
+0

Мы сталкиваемся с той же ситуацией ранее в нашем проекте. После недели поиска в Интернете и большого количества сообщений в форуме мы не могли понять проблему. Для целей тестирования мы устанавливаем кеш второго уровня «false», и система работает. Ehcache используется в нашем проекте. Я пытаюсь выяснить проблему, но она все еще викторирует меня. Попробуйте, возможно, это сработает. – Shashi

+0

Что такое версия Hibernate? – Shashi

ответ

2

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

1

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

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

+0

Очень хорошо объяснено в этом блоге - http://sschelter.blogspot.in/2009/12/forcing-use-of-transactional.html. Сессии управляются HibernateTransactionManager. Когда он встречает аннотацию Transactional по методу, создается новый сеанс, который автоматически закрывается после выполнения метода. Теперь, если аннотация Transactional отсутствует, вызов getSession() из HibernateDaoSupport автоматически создает новый сеанс, но этот не управляется контейнером, разработчик должен явно закрыть его – user3257644

1

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

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

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

0

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

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

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

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

Благодаря

0

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

0

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

Багги код был так:

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

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

  1. Начальный сделка
  2. Perform операция чтения
  3. Подтверждать транзакцию
  4. Закрыть сессию