1. 程式人生 > >資料庫連線失效導致程式異常怎麼辦—-mybatis資料庫連線池配置” 資料庫連線失效導致程式異常怎麼辦—-mybatis資料庫連線池配置

資料庫連線失效導致程式異常怎麼辦—-mybatis資料庫連線池配置” 資料庫連線失效導致程式異常怎麼辦—-mybatis資料庫連線池配置

以mysql為例,資料庫連線預設是8小時,也就是說一個連線8小時未使用,就將被關閉,但是如果你使用了資料庫連線池技術,當連線被關閉之後,程式並不知道這是一個失效的連線,依然進行使用,就會導致程式出錯。怎麼辦呢?

1.修改mysql的預設時間,可以最大改為一年。(但是不推薦,這樣缺乏可移植性,若是文件不全的話,伺服器做了遷移,運維都不知到怎麼搞了)

2.連線池在分配連線給請求時,先檢查連線的有效性,無效就丟棄重新獲取。

那麼,連線池如何配置呢?連引數丟不知道,百度一下 《mybatis資料庫連線池配置》出來的全是垃圾一堆,都是用了第三方連線池,而我們專案小,用mybatis自帶的就好了。那麼自己去看原始碼吧,在原始碼的 org.apache.ibatis包下發現了一個名為datasource的包,不用說,這就是連線池包了,進去,發現有 jndi,pooled,unpooled三個包,而預設的mybatis的conf.xml中就是用的是pooled,因此進去,只有5個類,依次檢視原始碼,在poolState類中找到:

看到什麼Driver,name,password是不是很親切,不就是在conf.xml裡面配置的引數麼,繼續看,還有很多,找到我們想要的關鍵屬性引數:帶有ping的三個,就是測試有效性的沒錯了(你為啥這麼肯定?告訴你,這是學計算機的人的直覺),我在官方文件裡咋沒看到這些引數呢?根據三個引數的名稱和型別推斷一下他們對應的value是啥,如下圖:

又想問我咋知道?舉個例子:poolPingEnabled pool是池的意思,ping代表測試,enabled是可不可用,典型的boolean型別,所以該引數的value應該為true or false,看錶意:是否進行測試,當然要測試啦,所以填true。後面的一樣的道理,帶有query的是查詢,第三個一看就是時間間隔撒。

好了,這就把自帶連線池配置好了,每隔360000秒就會自動去測試連線的有效性。傳送一個 select 1 查詢語句去測試。