Too many connections解決方案

原因:

my.ini 中設(shè)定的并發(fā)連接數(shù)太少或者系統(tǒng)繁忙導(dǎo)致連接數(shù)被占滿。

連接數(shù)超過(guò)了?MySQL?設(shè)置的值,與?max_connections?和?wait_timeout??都有關(guān)。

wait_timeout?的值越大,連接的空閑等待就越長(zhǎng),這樣就會(huì)造成當(dāng)前連接數(shù)越大。

解決方式:

打開(kāi) MYSQL 安裝目錄打開(kāi) my.ini 找到 max_connections 默認(rèn)是 100, 一般設(shè)置到500~1000比較合適,重啟 MySQL

顯示哪些線程正在運(yùn)行

how full processlist

狀態(tài):1. SLEEP線程正在等待客戶端發(fā)送新的請(qǐng)求。2. QUERY線程正在執(zhí)行查詢或者正在將結(jié)果發(fā)送給客戶端?!。? LOCKED在MYSQL服務(wù)層,該線程正在等待表鎖。在存儲(chǔ)引擎級(jí)別實(shí)現(xiàn)的鎖,如INNODB的行鎖,并不會(huì)體現(xiàn)在線程狀態(tài)中。 對(duì)于MYISAM來(lái)說(shuō)這是一個(gè)比較典型的狀態(tài)。但在其他沒(méi)有行鎖的引擎中也經(jīng)常會(huì)出現(xiàn)?!。? ANALYZING AND STATISTICS線程正在收集存儲(chǔ)引擎的統(tǒng)計(jì)信息, 并生成查詢的執(zhí)行計(jì)劃。5. COPYING TO TMP TABLE (ON DISK)線程正在執(zhí)行查詢, 并且將其結(jié)果集都復(fù)制到一個(gè)臨時(shí)文件中, 這種狀態(tài)一般要么是在做GROUP BY操作,要么是文件排序操作, 或者是UNION操作。 如果這個(gè)狀態(tài)后面還有ON DISK的標(biāo) , 那表示MYSQL正在將一個(gè)內(nèi)存臨時(shí)表放到磁盤(pán)上。

6. SORTING RESULT線程正在對(duì)結(jié)果集進(jìn)行排序。

7. SENDING DATA線程可能在多個(gè)狀態(tài)之間傳送數(shù)據(jù),或者生成結(jié)果集,或者在向客戶端返回?cái)?shù)據(jù)。

連接數(shù)設(shè)置多少是合理的?

查看mysql的最大連接數(shù):

how variables like '%max_connections%'

查看服務(wù)器響應(yīng)的最大連接數(shù):

how global status like 'Max_used_connections'

服務(wù)器響應(yīng)的最大連接數(shù)為3,遠(yuǎn)低于mysql服務(wù)器允許的最大連接數(shù)值

對(duì)于mysql服務(wù)器最大連接數(shù)值的設(shè)置范圍比較理想的是:服務(wù)器響應(yīng)的最大連接數(shù)值占服務(wù)器上限連接數(shù)值的比例值在10%以上,如果在10%以下,說(shuō)明mysql服務(wù)器最大連接上限值設(shè)置過(guò)高。

Max_used_connections / max_connections * 100% = 3/512 *100% ≈ 6%

wait_timeout

wait_timeout — 指的是mysql在關(guān)閉一個(gè)非交互的連接之前所要等待的秒數(shù)

如果你沒(méi)有修改過(guò)MySQL的配置,wait_timeout的初始值是28800

wait_timeout 過(guò)大有弊端,其體現(xiàn)就是MySQL里大量的SLEEP進(jìn)程無(wú)法及時(shí)釋放,拖累系統(tǒng)性能,不過(guò)也不能把這個(gè)指設(shè)置的過(guò)小,否則你可能會(huì)遭遇到“MySQL has gone away”之類的問(wèn)題

查看

how global variables like 'wait_timeout'

設(shè)置

et global wait_timeout=100

interactive_time

— 指的是mysql在關(guān)閉一個(gè)交互的連接之前所要等待的秒數(shù)

et global interactive_timeout=300

mysql終端查看timeout的設(shè)置

how global variables like '%timeout%'

總結(jié)

MySQL服務(wù)器所支持的最大連接數(shù)是有上限的,因?yàn)槊總€(gè)連接的建立都會(huì)消耗內(nèi)存,因此客戶端在連接到MySQL?Server處理完相應(yīng)的操作后,應(yīng)該斷開(kāi)連接并釋放占用的內(nèi)存。

如果MySQL?Server有大量的閑置連接,不僅會(huì)白白消耗內(nèi)存,而且如果連接一直在累加而不斷開(kāi),最終肯定會(huì)達(dá)到MySQL?Server的連接上限數(shù),這會(huì)報(bào)'too?many?connections'的錯(cuò)誤。

對(duì)于wait_timeout的值設(shè)定,應(yīng)該根據(jù)系統(tǒng)的運(yùn)行情況來(lái)判斷。在系統(tǒng)運(yùn)行一段時(shí)間后,可以通過(guò)show?processlist命令查看當(dāng)前系統(tǒng)的連接狀態(tài),如果發(fā)現(xiàn)有大量的sleep狀態(tài)的連接進(jìn)程,則說(shuō)明該參數(shù)設(shè)置的過(guò)大,可以進(jìn)行適當(dāng)?shù)恼{(diào)整小些。

JDBC URL中 要加一句話=false

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容