我們經常會遇見“MySQL:ERROR1040:Toomanyconnections”的情況,一種是訪問量確實很高,MySQL服務器抗不住,這個時候就要考慮增加從服務器分散讀寫壓力,另外一種情況是MySQL配置文件中max_connections值過小。
數據庫連接池最小連接數和最大連接數:
最小連接數是連接池一直保持的數據連接。如果應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費掉。
MySQL默認的最大連接數為100,MySQL服務器允許的最大連接數16384。
最大連接數是連接池能申請的最大連接數。如果數據連接請求超過此數,后面的數據連接請求將被加入到等待隊列中,這會影響之后的數據庫操作。如果最小連接數與最大連接數相差太大,那么,最先的連接請求將會獲利,之后超過最小連接數量的連接請求等價於建立一個新的數據庫連接。不過,這些大於最小連接數的數據庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閑超時后被釋放。
對於訪問數據庫來說,建立連接的代價比較昂貴,因此,我們有必要建立"連接池"以提高訪問的性能。我們可以把連接當作對象或者設備,池中又有許多已經建立的連接,訪問本來需要與數據庫的連接的地方,都改為和池相連,池臨時分配連接供訪問使用,結果返回后,訪問將連接交還。
對於並發較大的系統,建立一次連接然后緩存起來連續使用,直到程序結束等情況下再釋放連接,就能夠將系統資源集中在對數據庫操作的處理上,從而大大提高性能。通常情況下將數據連接的建立和斷開委托給一種能夠數據庫連接池的組件或服務進行管理。而DBCP,C3p0,Proxool等都是常用的開源的連接池組件。
在修改最大連接數的時候會有這樣一個疑問—這個值是不是越大越好,或者設置為多大才合適?這個參數的大小要綜合很多因素來考慮,比如使用的平台所支持的線程庫數量、服務器的配置(特別是內存大小)、每個連接占用資源(內存和負載)的多少、系統需要的響應時間等。可以在global或session范圍內修改這個參數。連接數的增加會帶來很多連鎖反應,需要在實際中避免由此引發的負面影響。
MySQL為每個連接分配線程來處理,可以通過threads_connected參數查看當前分配的線程數量:
比較threads_connected參數和前面提到的max_connections參數,也可以作為目前的系統負載的參照,決定是否需要修改連接數。
mysql>showstatuslike'%thread%';
小編結語:
更多內容盡在課課家教育!