2012-12-12 36 views
3

我做一個項目合併Hibernate和Spring的Java Web應用程序,Linux環境下使用Tomcat創建。由於Mysql 8小時超時問題,我們希望使用C3P0來管理我們的Mysql數據庫的連接池。 但是當我們使用它時,我們有很多創建的線程。我想通了東陽我對每個請求做了所有他們與一個內存狀態的打印,顯示我的提高內存和那種線程:許多線程使用C3P0與Hibernate /春

  • 名稱:C3P0PooledConnectionPoolManager [identityToken-> 1hged7o8r13kpj7n1h3ycia | 39c446 ] -HelperThread-#0守護進程:真正的組! maingroupParent:system alive:true interrupted:false
  • name:C3P0PooledConnectionPoolManager [identityToken-> 1hged7o8r13kpj7n1h3ycia | 17ec0e8] -AdminTaskTimer守護進程:真正的組!主要groupParent:系統活着:真打斷:假

它可以產生500個多線程像這樣的人,有足夠的時間之後。

這裏是我的hibernate.cfg.xml:

<property name="connection.provider_class"> 
      org.hibernate.connection.C3P0ConnectionProvider</property> 
    <property name="hibernate.c3p0.acquire_increment">1</property> 
    <property name="hibernate.c3p0.idle_test_period">5</property> 
    <property name="hibernate.c3p0.max_size">100</property> 
    <property name="hibernate.c3p0.max_statements">100</property> 
    <property name="hibernate.c3p0.min_size">10</property> 
    <property name="hibernate.c3p0.timeout">5</property> 

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myBase</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password"></property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <property name="hibernate.default_schema">myProject</property> 
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 
    <property name="show_sql">false</property> 

    <property name="cache.provider_class"> 
     org.hibernate.cache.NoCacheProvider 
    </property>   

我也嘗試添加C3P0化子性質的文件,但除了減少輔助線程數,它不刪除unsused螺紋:

c3p0.maxStatements=5  

c3p0.maxIdleTime=10 

c3p0.numHelperThreads=1 

c3p0.testConnectionOnCheckout=true 
c3p0.preferredTestQuery=SELECT 1 

c3p0.initialPoolSize=1 
c3p0.minPoolSize=1 
c3p0.maxPoolSize=10 

c3p0.acquireIncrement=1 
c3p0.idleConnectionTestPeriod=1 

沒有人有,爲什麼出現這種情況,如何解決這個問題的想法?

非常感謝。

回答

1

好吧,我發現屬性的組合來解決我的問題,記住,我沒有在同一時間需要很多連接:

  • c3p0.maxStatements = 5
  • c3p0.maxIdleTime = 10
  • c3p0.numHelperThreads = 3
  • c3p0.testConnectionOnCheckout =真
  • c3p0.preferredTestQuery = SELECT 1
  • c3p0.initialPool大小= 1
  • c3p0.minPoolSize = 1
  • c3p0.maxPoolSize = 1 c3p0.acquireIncrement = 1
  • c3p0.idleConnectionTestPeriod = 1
  • c3p0.maxAdministrativeTaskTime = 1

感謝大家

+3

添加idleConnectionTestPeriod = 1的方式過於激進。我不會推薦它。 –

1

我希望它來創建一個線程數比例來c3p0.minPoolSizec3p0.maxPoolSize和你的最大值爲10

http://www.mchange.com/projects/c3p0/#other_ds_configurationnumHelperThreads和maxAdministrativeTaskTime幫助配置數據源線程池的行爲。通過默認情況下,每個DataSource只有三個關聯的助手線程。如果性能似乎在重負載下拖動,或者如果您通過JMX觀察或直接檢查PooledDataSource,則「未完成任務」數通常大於零,請嘗試增加numHelperThreads 。 maxAdministrativeTaskTime對於遇到無限期掛起的任務和「APPARENT DEADLOCK」消息的用戶可能非常有用。 (見附錄A的更多。)「

numHelperThreads定義了多少個線程每個數據源的使用,所以實際上你將有10個線程與numHelperThreads=1

只有這樣,才能確保C3P0消耗只有一個線程是設置c3p0.minPoolSizec3p0.maxPoolSize 1,但這種違背了連接池的目的。

+0

如果我設置「c3p0.numHelperThreads = 0」,我的請求永遠不會結束,並且默認值爲3. – user954156

+0

您可以嘗試,但我希望某些東西不起作用,我希望這些線程能夠moni爲你的連接狀態,也許做更多。 –

+0

我試着用「c3p0.numHelperThreads = 3」和「c3p0.maxAdministrativeTaskTime = 10」而沒有任何改變 – user954156

1

,如果你看到C3P0助手和定時器線程的乘法,你在某種程度上創造C3P0數據源的衆多當你想在那裏只是一個。如果您正在重新加載應用程序但忘記關閉,有時會發生這種情況e()您回收時的舊c3p0數據源。

有效看起來你是「泄露」的數據源。你需要弄清楚爲什麼/在哪裏發生。對於某些線索,請在INFO級別檢查日誌以查找c3p0 DataSource初始化消息。例如,搜索字符串「初始化c3p0池」。

祝你好運!