connection holder is null新增解決方案(2018-06-02)


最近在做Java后台的項目,用到了druid數據庫連接池,阿里出品,肯定是精品的意思咯,這也是我們老大搭建的框架,我就站在前人的肩膀上飛翔了。先前在一個事物里,使用了多條數據庫操作,都是正常的,但是前天出了問題,一直報java.sql.SQLException: connection holder is null 異常,很是苦惱。

因為能呼吸新鮮空氣,首先用的是Google,但是這個是阿里出品,國人用的比較多,找到的基本都是咱們程序員弄的答案,大致的解決方案如下:

1:設置removeAbandonedTimeout超時時間,配置一般都是180,設置成1800,並且將removeAbandoned設置為true

/*是否自動回收超時連接*/

<property name="removeAbandoned" value="true" />

/*延長這個所謂的超時時間*/

<property name="removeAbandonedTimeout" value="1800" />

2:直接關閉removeAbandoned

<property name="removeAbandoned" value="false">

看到這兩個答案,心里狂喜,原來很多人遇到了一樣的問題,那就開干,結果,GG,對我來說作用並不大。我也查閱了我的Git日志,自始至終沒有修改過配置,所以配置對我來說肯定是對的,而且先前跑的代碼也是正確,就不知道哪兒出問題了。

但是先前想到,因為在代碼review的時候,把數據庫連接給關閉了,但是我后面又想要使用這個鏈接,而我出錯的地方就是在我想重新獲取連接的時候出錯了,貼上我的代碼

conn = DataSourceUtils.getConnection(transactionManager.getDataSource());

就是這行報了錯。在使用之前,我把連接關閉了,用的方法如下

 /**
 * 快捷關閉
 * 
 * @param connection
 * @paramlogger.error("", e);
 */
public void shortCutClose(Connection connection, Statement statement, ResultSet rs) {
	try {
		if (rs != null && !rs.isClosed()) {
			rs.close();
		}
		if (statement != null && !statement.isClosed()) {
			statement.close();
		}
		if (connection != null && !connection.isClosed()) {
			if (!connection.getAutoCommit())
				connection.setAutoCommit(true);
			connection.close();
		}
	} catch (SQLException e) {
		logger.error("", e);
	}

}

自此發現問題,我把conn關閉了,我后面想用也難呀。所以誕生了第三種方案,就是不能把conn關閉后還想着去用它。如果你確定后續還需要使用,那么就不要畫蛇添足啦

為什么會找到這里,一方面是因為項目代碼都是自己寫的,有懷疑的地方大概有個數,還有就是借用了大家問答下面的回答,我就是看了關於druid數據連接池拋出的 connection holder is null 異常這篇文章里“毛衣”哥的回復,我才想到要去用這個方法嘗試下,結果果然可以,所以我給他寫了個評論,支持他分享,但是又怕他沒看見,所以還是立馬下定決心,自己寫下這個感悟,提供另一個思路給需要的小伙伴。主要是參考了好幾個寫前面兩個方案的博客,后面的評論還是有很多利用了這兩個方案沒解決的,所以我這里只是提供另外一種思路給各位,希望能打開大家的其他思路。

本人以前一直是Android開發,寫了3年,現在轉行寫Java后台了,所以難免采坑的地方比較多,后續需要多一些這種風暴,踩完坑,爬出來,然后記錄下這深刻的教訓。歡迎大家和我一起交流寫程序,哈哈

愛生活,愛學習,愛感悟,愛挨踢


免責聲明!

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



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