溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL讀寫分離后Druid連接池參數(shù)的優(yōu)化方式

發(fā)布時間:2021-09-04 16:05:14 來源:億速云 閱讀:268 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“MySQL讀寫分離后Druid連接池參數(shù)的優(yōu)化方式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MySQL讀寫分離后Druid連接池參數(shù)的優(yōu)化方式”吧!

問題回顧

異常日志描述:

MySQL讀寫分離后Druid連接池參數(shù)的優(yōu)化方式

從異常信息反映來看,問題關(guān)鍵有兩點(diǎn)

  1. 數(shù)據(jù)庫連接池超時設(shè)置大于wait_timeout

  2. 日志提示,可以通過驗(yàn)證數(shù)據(jù)庫連接或者設(shè)置:autoReconnect=true 來避免此異常

從以上兩點(diǎn)可以推測

第一、應(yīng)用程序數(shù)據(jù)庫連接池超時參數(shù)設(shè)置有問題

第二、安裝Mysql數(shù)據(jù)庫時,對于Mysql的內(nèi)在參數(shù)wait_timeout沒有做實(shí)際場景的優(yōu)化處理

問題定位

wait_timeout參數(shù)具體用途

wait_timeout具體含義是服務(wù)器關(guān)閉非交互連接之前等待活動秒數(shù)。MySQL缺省配置情況下,wait_timeout的初始值是28800秒,也就是8小時。如果wait_timeout超時時間設(shè)置過大,在MySQL管理系統(tǒng)里會產(chǎn)生大量的SLEEP進(jìn)程無法及時釋放,會導(dǎo)致服務(wù)器系統(tǒng)性能下降;同時該參數(shù)設(shè)置過小,會導(dǎo)致Mysql處理某些事務(wù)未處理,連接不可用狀態(tài)。

也就是說如果在wait_timeout設(shè)置期間內(nèi),數(shù)據(jù)庫連接Connection一直處于空閑等待狀態(tài),mysql內(nèi)部會自動關(guān)閉此連接,而應(yīng)用程序無法感知到,依然認(rèn)為連接池合法持有該連接。當(dāng)應(yīng)用端再次用該連接來進(jìn)行數(shù)據(jù)庫操作時,就產(chǎn)生上述異常錯誤。

應(yīng)用端Druid數(shù)據(jù)庫連接池參數(shù)排查

MySQL讀寫分離后Druid連接池參數(shù)的優(yōu)化方式

發(fā)現(xiàn)連接池有個MaxWait參數(shù)設(shè)置過大:60000毫秒

druidDataSource.setMaxWait(60000)

然后在CSDN上,發(fā)現(xiàn)有個同行碰到同樣的問題:

發(fā)現(xiàn)數(shù)據(jù)庫等待超時時間(wait_timeout)是28800s,也就是8小時,而應(yīng)用程連接池參數(shù)max-wait:  30000,所以導(dǎo)致項(xiàng)目判定該鏈接可用,而mysql判定該連接不可用導(dǎo)致連接失敗。

解決辦法

根據(jù)上面的分析思路,我們排查了Mysql生產(chǎn)庫,發(fā)現(xiàn)默認(rèn)Mysql超時時間(wait_timeout)也是28800s,但是應(yīng)用層連接池MaxWait參數(shù)設(shè)置成60000,于是我把MaxWait參數(shù)設(shè)置成10000,小于Mysql超時時間(wait_timeout):28800  ,在測試環(huán)境等待8小時后,報(bào)錯消失了。

其他擴(kuò)展思路(來源網(wǎng)絡(luò))

思路一:在jdbc-url后添加 &autoReconnect=true,使用后無效,查的該方案只適用于Mysql4之前的版本有效

思路二:將mysql回收空閑連接的時間變長,mysql默認(rèn)回收時間是8小時,可以在mysql目錄下的my.ini中增加下面配置,將時間改為1天。單位是秒,最大好像是24天。  此配置會拖累數(shù)據(jù)庫性能,隨棄用該方案。

思路三:配置druid鏈接池,使用 validation-query test-on-borrow: true test-while-idle: true  三種屬性,每次獲取數(shù)據(jù)庫連接時判斷該連接是否可用。同時設(shè)置druidDataSource.setPhyTimeoutMillis參數(shù)

連接最大存活時間,默認(rèn)是-1(不限制物理連接時間),從創(chuàng)建連接開始計(jì)算,如果超過該時間,則會被清理druidDataSource.setPhyTimeoutMillis(15000);

參考例子

目前項(xiàng)目中趨于穩(wěn)定的連接池參數(shù)優(yōu)化實(shí)戰(zhàn),參考如下:

MySQL讀寫分離后Druid連接池參數(shù)的優(yōu)化方式

Druid連接池參數(shù)官方說明:

MySQL讀寫分離后Druid連接池參數(shù)的優(yōu)化方式

到此,相信大家對“MySQL讀寫分離后Druid連接池參數(shù)的優(yōu)化方式”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI