2013-04-26 74 views
0

我的JAVA應用程序使用多線程一次處理多個請求。所以,不同的請求會被不同的線程同時處理。c3p0未獲取連接,但存在空閒連接

我訪問我的休眠和C3P0 Oracle數據庫,使用以下hibernate.properties:

hibernate.bytecode.use_reflection_optimizer=false 
hibernate.connection.driver_class=oracle.jdbc.OracleDriver 
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect 
hibernate.search.autoregister_listeners=false 

hibernate.connection.url=${jdbc.url} 
hibernate.default_schema=${jdbc.schema} 
hibernate.connection.username=${jdbc.username} 
hibernate.connection.password=${jdbc.password} 

hibernate.c3p0.min_size=5 
hibernate.c3p0.max_size=10 
hibernate.c3p0.timeout=1800 
hibernate.c3p0.max_statements=50 

而且c3p0.properties:

c3p0.preferredTestQuery=SELECT 1 from dual 
c3p0.testConnectionOnCheckin=true 
c3p0.idleConnectionTestPeriod=10 
c3p0.driverClass=oracle.jdbc.driver.OracleDriver 

(我也測試了它testConnectionOnCheckout而不是testConnectionOnCheckin)。

我的Java代碼執行以下操作:

Session session = sessionFactory.openSession(); 
    try{     
     session.beginTransaction(); 

     Log.debug(localizator + "Start"); 
     processCounters(id, user, session); 
     Log.debug(localizator + "Stop"); 
     session.getTransaction().commit(); 

    } finally{ 
     session.close(); 
    } 

當我運行這個它打印「開始」爲每個線程,但在一個被「鎖定」堅持到數據庫中,並沒有「停止」印。

如果我在數據庫上看到打開的會話,則會有10個打開的會話(在c3p0上配置的最大數量),但它們都是空閒的。 有沒有辦法讓c3p0釋放一些空閒的連接,至少,其中一個線程結束其進程(appart增加最大連接數)?

+0

你可能有更大的問題 - 我懷疑你的'processCounters'方法正在創建一個死鎖。也許採取線程轉儲並通過它。 – 2013-04-26 15:58:27

+0

不要這樣想。它在超時秒數結束時結束,因此這是空閒連接未釋放的問題。我已經改變了BoneCP的c3p0,現在它像一個魅力 – Goyo 2013-04-26 16:30:23

回答

0

將連接池更改爲BoneCP已解決該問題。我用下面的配置(我認爲這可能是調整提高的過程中更加的速度):

bonecp.idleMaxAge=240 
bonecp.idleConnectionTestPeriod=60 
bonecp.partitionCount=3 
bonecp.acquireIncrement=1 
bonecp.maxConnectionsPerPartition=5 
bonecp.minConnectionsPerPartition=2 
bonecp.statementsCacheSize=50 
bonecp.releaseHelperThreads=3 

現在不掛和,什麼是更好的,它提高了性能的查詢。