MySQL5 6資料庫8小時內無請求自動斷開連線

2021-09-07 19:11:45 字數 2231 閱讀 8085

問題:

最近的專案中,發現mysql資料庫在8個小時內,沒有請求時,會自動斷開連線,這是mysql伺服器的問題。

the last packet successfully received from the server was 1,836,166 milliseconds ago.  the last packet sent successfully to the server was 29,134 milliseconds ago.

原因:

mysql伺服器預設的「wait_timeout」是28800秒即8小時,意味著如果乙個連線的空閒時間超過8個小時,mysql將自動斷開該連線,

而連線池卻認為該連線還是有效的(因為並未校驗連線的有效性),當應用申請使用該連線時,就會導致上面的報錯。

解決方案:

資料庫連線如果空閒時,進行有效性驗證。(如果使用連線池,配置幾個屬性即可)

"

testonborrow

" value="

true

">

"testonreturn

" value="

true

">

"testwhileidle

" value="

true

">

"validationquery

" value="

select 1 from dual

">

oracle資料庫:select 1 from dual

sqlserver資料庫:select 1

下面以dbcp連線池舉例——

(其他連線池應該也都有以下屬性,可以檢視文件或原始碼),下圖是我的專案的連線池的原始碼舉例:

在dbcp連線池中有以下幾個屬性:

testonborrow、testonreturn、testwhileidle,他們的意思是當是取得連線、返回連線或連線空閒時是否進行有效性驗證(即是否還和資料庫連通的),預設都為false。所以當資料庫連線因為某種原因斷掉後,再從連線池中取得的連線,實際上可能是無效的連線了,所以,為了確保取得的連線是有效的,可以把把這些屬性設為true。當進行校驗時,需要另乙個引數:validationquery,對oracle來說,可以是:select count(*) from dual,實際上就是個簡單的sql語句,驗證時,就是把這個sql語句在資料庫上跑一下而已,如果連線正常的,當然就有結果返回了。 

然後minevictableidletimemillis配合timebetweenevictionrunsmillis,每過timebetweenevictionrunsmillis秒對連線池進行一次檢測,將物件閒置時間超過minevictableidletimemillis秒的物件進行銷毀,建立新的物件來取代。這樣就能保證時刻都有正常的連線池物件存在。

還有其他的一些引數,可以參考源**。 

部分引數簡要說明: 

removeabandoned :是否自動**超時連線 

removeabandonedtimeout:超時時間(以秒數為單位) 

removeabandoned=true那麼在getnumactive()快要到getmaxactive()的時候,系統會進行無效的connection的**,**的connection為removeabandonedtimeout(預設300秒)中設定的秒數後沒有使用的connection 

logabandoned:logabandoned=true的話,將會在**事件後,在log中列印出**connection的錯誤資訊,包括在哪個地方用了connection卻忘記關閉了,在除錯的時候很有用。 

maxwait:超時等待時間以毫秒為單位 

maxidle:最大空閒連線 

minidle:最小空閒連線 

maxactive:最大連線數 

testonborrow、testonreturn、testwhileidle、validationquery:上面有介紹 

另外很重要的一點是每次連線使用完了不要忘了呼叫connection.close()使連線返回到連線池

mysql 查詢24小時內 資料,null用0代替

獲取24小時資料總數,但是當某乙個小時內沒有產生資料時,group by就篩選不出來那個時間段的資料,但實際需求是要用0代替。解決方法如下 select dayhour,if count is null,0,count from select count as count,date format c...

如何解決mysql資料庫8小時無連線自動關閉

windows下開啟my.ini,增加 interactive timeout 28800000 wait timeout 28800000 專家解答 mysql是乙個小型關係型資料庫管理系統,由於mysql體積小 速度快 總體擁有成本低,尤其是開放原始碼這一特點,許多中小型 為了降低 總體擁有成本...

如何解決mysql資料庫8小時無連線自動關閉

windows下開啟my.ini,增加 interactive timeout 28800000 wait timeout 28800000 專家解答 mysql是乙個小型關係型資料庫管理系統,由於mysql體積小 速度快 總體擁有成本低,尤其是開放原始碼這一特點,許多中小型 為了降低 總體擁有成本...