S2SH鏈接不關(guān)閉
一套S2SH的應(yīng)用,現(xiàn)用單線程,連續(xù)發(fā)1000個(gè)請(qǐng)求,用的DBCP鏈接池,結(jié)果報(bào)數(shù)據(jù)庫(kù)鏈接不夠用:ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error Timeout waiting for idle object
在JAVA加上LOG:
log.info("active: " + dataSource.getNumActive() + " (max: "
+ dataSource.getMaxActive() + ") " + "idle: " + dataSource.getNumIdle()
+ "(max: " + dataSource.getMaxIdle() + ")");
+ dataSource.getMaxActive() + ") " + "idle: " + dataSource.getNumIdle()
+ "(max: " + dataSource.getMaxIdle() + ")");
結(jié)果顯示為:
active: 25 (max: 100) idle: 0(max: 30)
active的數(shù)量一直增加,但idle的數(shù)量一直為0。當(dāng)程序向鏈接池要鏈接的時(shí)候,如果池沒(méi)有,就會(huì)新建一個(gè),active數(shù)就會(huì)加1,關(guān)閉鏈接后,鏈接會(huì)返回池,idle數(shù)加1。idle為0則表示池里沒(méi)有鏈接。
這樣說(shuō)明鏈接一直在創(chuàng)建,沒(méi)有關(guān)閉放回池里。但鏈接是由SPRING和HIBERNATE管理的,代碼中沒(méi)有關(guān)閉鏈接的語(yǔ)句。之后試了N多配置,都還沒(méi)解決,如增加maxActive數(shù)等。最后,加上這一行,問(wèn)題才終于解決:
<prop key="hibernate.connection.release_mode">after_transaction</prop>
這里默認(rèn)值是auto,如果是用JTA事務(wù)才適用,如果是JDBC事務(wù),就只能用after_transaction。
這樣每次事務(wù)結(jié)束后,就會(huì)關(guān)閉鏈接返回鏈接池。
posted on 2013-06-07 15:09 paulwong 閱讀(421) 評(píng)論(0) 編輯 收藏 所屬分類: HIBERNATE 、SPRING