2010-03-19 59 views
1

以下是配置細節:休眠不釋放數據庫連接

<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> 

我們的應用程序通過春季& 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); 
} 
} 
+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 on方法時,會創建一個新的Session,該方法執行後會自動關閉。現在,如果缺少註釋Transactional,對HibernateDaoSupport的getSession()的調用也會自動創建一個新的會話,但這不是由容器管理的,開發人員需要明確地關閉它 – user3257644

1

我不認爲你的c3p0設置正在被擊中,因爲你有> 100 db的連接。這就是說你應該把你的idle_test_period設置爲一個小於c3p0超時的值。

另外,哪個版本的hibernate在確定爲什麼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也有類似的問題。我們的印象是,在事務會話下執行讀取操作時,不需要提交事務。然而我們意識到交易必須承諾儘管它只是一個閱讀運作(如果您已開始交易)。一旦我們完成了交易,泄漏消失了。

缺陷代碼是這樣的:

  1. 開始交易
  2. 執行讀取操作
  3. 關閉會話

上述替換爲以下過程和泄漏不見了。

  1. Begining交易
  2. 執行讀取操作
  3. 提交事務
  4. 關閉我們面臨着同樣的情況早在我們的項目會議