您好,登錄后才能下訂單哦!
小編給大家分享一下JDBC連接Mysql長(zhǎng)時(shí)間無(wú)動(dòng)作連接失效怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
做的有一個(gè)項(xiàng)目使用JDBC手動(dòng)創(chuàng)建Connection實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的自定義數(shù)據(jù)庫(kù)連接池,用來(lái)支持Canal解析數(shù)據(jù)庫(kù)Binlog指定業(yè)務(wù)庫(kù)的插入修改SQL來(lái)進(jìn)行數(shù)據(jù)庫(kù)分表備份(按照月份)操作.
但是發(fā)現(xiàn)當(dāng)一個(gè)一段時(shí)間(較長(zhǎng))沒(méi)有進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),連接都失效了,導(dǎo)致SQL執(zhí)行失敗失效提示為No operations allowed after connection closed
經(jīng)過(guò)搜索發(fā)現(xiàn)這個(gè)問(wèn)題是由于Mysql默認(rèn)一個(gè)已創(chuàng)建的長(zhǎng)連接28800秒(八小時(shí))內(nèi)沒(méi)有任何動(dòng)作則會(huì)斷開(kāi)連接,該值對(duì)應(yīng)參數(shù)為wait_timeout.當(dāng)超時(shí)時(shí)間內(nèi)有執(zhí)行動(dòng)作則會(huì)重新計(jì)時(shí)
查詢Mysql超時(shí)連接時(shí)長(zhǎng)命令show global variables like'wait_timeout'查看當(dāng)前設(shè)置的超時(shí)斷開(kāi)連接時(shí)長(zhǎng).
將其改為10,本地服務(wù)運(yùn)行功能發(fā)現(xiàn)重現(xiàn)了No operations allowed after connection closed錯(cuò)誤,即確實(shí)是連接超時(shí)失效
該方法不能根治這個(gè)問(wèn)題,因?yàn)椴荒艽_認(rèn)服務(wù)空閑時(shí)長(zhǎng)而精確設(shè)置timeout并且還會(huì)造成多余連接長(zhǎng)時(shí)間未斷開(kāi)而影響性能,所以不建議使用.建議在代碼層面進(jìn)行解決
通過(guò)set global wait_timeout=time(秒)來(lái)修改最長(zhǎng)連接等待超時(shí)時(shí)間,但是這樣設(shè)置當(dāng)Mysql重啟失效
可以通過(guò)修改my.ini文件永久改動(dòng)超時(shí)時(shí)間,如下配置
interactive_timeout=28800000 wait_timeout=28800000
使用conn.isValid(int timeout)(秒)判斷是否失效返回true表示連接有效,返回false表示連接失效.當(dāng)失效時(shí)則重新獲取一個(gè)數(shù)據(jù)庫(kù)連接即可,之前的對(duì)象由于引用丟失會(huì)被回收掉.
在URL最后添加autoReconnect=true參數(shù),jdbc:mysql://hostaddress:3306/xhb?autoReconnect=true.我這里對(duì)這個(gè)沒(méi)有效果,可能是對(duì)框架連接池有用.
比如默認(rèn)時(shí)間是八小時(shí),則每七小時(shí)對(duì)連接執(zhí)行一次select 1語(yǔ)句來(lái)刷新該連接在數(shù)據(jù)庫(kù)的超時(shí)等待時(shí)長(zhǎng)
也可以1 2 4一起使用,來(lái)防止突然一個(gè)流量靜默期間后突發(fā)流量高峰而導(dǎo)致獲取連接不及時(shí)
補(bǔ)充:連接總是被mysql回收_一般連接池是怎么處理mysql自動(dòng)回收長(zhǎng)時(shí)間
若干套 MySQL 環(huán)境,只有一套:
行為異常,e5a48de588b63231313335323631343130323136353331333436316239懷疑觸發(fā) bug
性能異常,比其他環(huán)境都要低
在這種場(chǎng)景下,我們一般的做法是首先控制變量,查看軟硬件配置,以及 MySQL 的參數(shù)配置。關(guān)于 MySQL 的參數(shù)配置對(duì)比,如果我們?nèi)斯?duì)比的話只會(huì)關(guān)注某些重點(diǎn)參數(shù),而缺少了整體細(xì)節(jié)上的的對(duì)比。在這里我們推薦給大家 Percona Toolkit 中的一個(gè)工具 pt-config-diff
更準(zhǔn)確的復(fù)制延時(shí) pt-heartbeat在 MySQL 中,復(fù)制延遲可以理解為由兩部分組成:1. 主庫(kù)已經(jīng)生成了 BINLOG,但是還沒(méi)有發(fā)送給從庫(kù) -- 我們?cè)谶@里稱之為:日志延遲2. 從庫(kù)已經(jīng)接收到了 BINLOG,但是還沒(méi)有應(yīng)用完成 -- 我們?cè)谶@里稱之為:應(yīng)用延遲MySQL 原生的查看復(fù)制延遲的手段為:show slave status\G中的Seconds_Behind_Master。這種觀測(cè)手法只能觀測(cè)出應(yīng)用延遲。在異步復(fù)制或降級(jí)的半同步復(fù)制下,誤差較大,無(wú)法準(zhǔn)確的反映出整體復(fù)制延時(shí)。
1. 在 Master 上循環(huán)插入:insert into database.heartbeat (master_now) values(NOW())
2. database.heartbeat 的變更會(huì)跟隨主從復(fù)制流向從庫(kù)
3. 系統(tǒng)當(dāng)前時(shí)間 - 從庫(kù)表中的時(shí)間 = 從庫(kù)實(shí)際的復(fù)制延時(shí)
更簡(jiǎn)單的參數(shù)配置建議 pt-variable-advisortoolkit 中包含了一個(gè)簡(jiǎn)單的 MySQL 參數(shù)優(yōu)化器,可以對(duì)參數(shù)配置做簡(jiǎn)單的優(yōu)化建議。
更準(zhǔn)確的復(fù)制延時(shí) pt-heartbeat在 MySQL 中,復(fù)制延遲可以理解為由兩部分組成:1. 主庫(kù)已經(jīng)生成了 BINLOG,但是還沒(méi)有發(fā)送給從庫(kù) -- 我們?cè)谶@里稱之為:日志延遲2. 從庫(kù)已經(jīng)接收到了 BINLOG,但是還沒(méi)有應(yīng)用完成 -- 我們?cè)谶@里稱之為:應(yīng)用延遲MySQL 原生的查看復(fù)制延遲的手段為:show slave status\G中的Seconds_Behind_Master。這種觀測(cè)手法只能觀測(cè)出應(yīng)用延遲。在異步復(fù)制或降級(jí)的半同步復(fù)制下,誤差較大,無(wú)法準(zhǔn)確的反映出整體復(fù)制延時(shí)。
更易用的調(diào)試工具 pt-pmp在某些情況下,我們肯定會(huì)遇到某些故障無(wú)法從日志,以及狀態(tài)命令中找到原因,需要深入到程序邏輯級(jí)別。又或者我們需要立即通過(guò)非常規(guī)手段恢復(fù)故障數(shù)據(jù)庫(kù),但是又想保留足夠多的故障信息。來(lái)避免我們事后復(fù)現(xiàn)問(wèn)題的頭疼。pt-pmp 便是在這種場(chǎng)景下幫助我們的工具。它會(huì)使用 gdb 來(lái)打印 mysqld 的堆棧信息,并把調(diào)用鏈相同的線程堆棧合并。堆棧合并的功能對(duì)于 MySQL 這種多線程的應(yīng)用非常有幫助,會(huì)節(jié)省我們大量的時(shí)間。
以上是“JDBC連接Mysql長(zhǎng)時(shí)間無(wú)動(dòng)作連接失效怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。