Spring c3p0連接池無法釋放解決方案


通過c3p0配置連接池的時候,在進行壓力測試的時候,日志出現了這樣一個錯誤:Data source rejected establishment of connection, message from server: “Too many connections”
數據庫的連接過多。
然后查看mysql的最大連接數,為100。
這里寫圖片描述
於是便更改最大連接池。
由於MySQL默認的最大連接數為100,MySQL允許的最大連接數16384。Windows下由於線程數限制MySQL最大連接數為2048。
於是更改為2000。但是數據庫連接池最大只有這多,如果建立連接數過多,依舊會超載。
所以要從根本上解決,那么就要釋放連接池。
參考博客:http://blog.csdn.net/yonglelaoren/article/details/28886593

解決辦法:
將getSessionFactory().OpenSession()更改為getSessionFactory().getCurrentSession()。
getSessionFactory().OpenSession() 這種方法從spring管理的sessionFactory中創建一個session,此session不是線程綁定的。當執行完一個實務的時候自動關閉session.這種方法不用手動管理實務,但是同一個線程多次的開啟和關閉session,浪費系統資源和影響執行效率。而且通過這種方式打開的session不會自動關閉,現象時查詢多次之后連接池滿了,不會再繼續查詢了。

getSessionFactory().getCurrentSession()方法從spring管理的sessionFactory中創建一個綁定線程的session.spring會根據該線程的執行情況來自動判斷是關閉session還是延遲關閉。這樣做可以避免手動的管理實務,同時一個線程最多開啟和關閉一次session又可以提高程序的性能。


還有一種原因可能是每次查詢都會初始化連接數:<property name="initialPoolSize" value="3" />。導致查詢多次就會造成too many connects錯誤。因此刪除掉,應該在c3p0的文件配置里面配置。


通過更改session方法后,又出現這種錯誤:No Hibernate Session bound to thread 。
解決辦法:
感覺是事務的問題,檢查了下Spring配置,的確配置了事務,但是為什么會報這個錯呢。於是便在網上找到方法,在dao層加上@Transactional ,於是問題就解決了。
參考:http://www.cnblogs.com/hanxirensheng/archive/2012/03/28/2422433.html

還有可能的原因是沒有在service沒有在 spring管理而報的錯。添加這句:<tx:annotation-driven transactionmanager="transactionManager"/>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM