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增加最大連接數)?
你可能有更大的問題 - 我懷疑你的'processCounters'方法正在創建一個死鎖。也許採取線程轉儲並通過它。 – 2013-04-26 15:58:27
不要這樣想。它在超時秒數結束時結束,因此這是空閒連接未釋放的問題。我已經改變了BoneCP的c3p0,現在它像一個魅力 – Goyo 2013-04-26 16:30:23