原因:
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