2014-04-25 78 views
3

MySQL具有強制執行最大連接數的功能,max_user_connectionsPHP到MySQL連接:等到連接可用時,而不是拋出「max_user_connections超出」錯誤?

從PHP(和other languages)連接時,如果您超過該數字,我的理解是您的連接將失敗,並顯示錯誤,指出您已超出最大連接數。正確?

我的意願是讓連接呼叫等待(達到某個超時限制)以使連接可​​用。但是,我一直無法通過閱讀MySQL文檔和搜索網頁來確定一種方法。

我擔心的是,如果我們的網絡應用流量氾濫,導致大量的MySQL連接嘗試同時發生,我們的一些用戶腳本將以錯誤結束。當然,我們可以修改調用代碼以嘗試重新連接達到特定次數,但如果我們可以修改連接嘗試本身來處理此操作,而不必將每個「連接」調用包裝在一個循環。此外,循環不會導致真正的FIFO隊列,因爲每個單獨的調用線程都會等待一段時間並再次嘗試,並且它是否獲得連接取決於在該特定時刻是否有連接可用。然後再等待,等待連接可能打開,另一個線程「進一步」可能會抓住它。

因此,當使用任何PHP API連接到MySQL時,有沒有辦法在「等到連接可用」時尚時嘗試連接?

+0

多年來我已經看到這個問題幾十次了。我認爲你的做法有缺陷。原因很可能是編程效率低下,比如查詢花費太長時間(所以優化有問題的查詢或優化表索引等),或者你太頻繁地訪問數據庫並獲取應該緩存的數據。如果你真的需要更多的連接(這是非常令人懷疑的),只需創建一個新用戶並拆分兩個用戶之間的連接即可。 – dataskills

+0

我很欣賞架構反饋,但請記住,在網絡世界中,請求可能會同時發生。如果你碰到10個併發請求,你的max_user_connections是4,你只允許一個用戶(這是最低ClearDB層的情況,btw),那麼你有6個連接太多。您的查詢可能只需25ms即可完成,但如果這十個請求確實是併發的,那麼您有六個請求失敗。 – Josh

+0

另外,這完全是假設。我目前沒有遇到「超出max_user_connections限制」錯誤。我試圖找出避免出現這種情況的最佳策略,並且允許連接請求等待似乎只有一種策略。你提到的其他人,如適當的緩存數據,肯定是有效的,但不是我的問題。 – Josh

回答

2

MySQL沒有任何功能來執行您所描述的內容。也就是說,當您點擊max_connections時,MySQL沒有連接的FIFO(隊列)。如果無法立即連接,所有連接都會發生錯誤。

內置於MySQL中最接近的相關事物是配置變量back_log,它只配置未完成連接數的限制。也就是說,主MySQL線程需要花費少量時間來檢查傳入連接,並且這些線程會在偵聽隊列中堆積起來,這在套接字甚至完成之前以及在MySQL確定是否有多於max_connections線程之前。實際上,即使服務器當前遠低於max_connections線程,您也可以在偵聽隊列中獲得一組未完成的連接。

http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_back_log

另一種選擇是HA-代理添加到混合物,因爲HA-代理確實有提供隊列功能。下面是解釋了博客這個更多:http://flavio.tordini.org/a-more-stable-mysql-with-haproxy

坦率地說,大多數網站只是增加max_connections,直到它可以在流量處理典型的尖峯,並從那裏只是嘗試優化數據庫的活動,所以連接是持續時間短,因此你有吞吐量好。它還有助於編寫應用程序以儘可能晚地進行連接,並在所有查詢完成後儘快斷開連接。

如果您的流量超出max_connections的非典型峯值,那麼您的應用程序將收到一個錯誤指示。你應該編寫你的應用程序來優雅地處理這些錯誤。也就是說,可以很好地顯示消息,例如「我們很抱歉,我們的負載太大,無法處理您的請求,請稍後再試。」這至少比突然的白色屏幕或堆棧跟蹤或其他東西好。

+0

我得看看HA-Proxy,這聽起來很有趣。 – Josh

-2

試加下面的PHP代碼中的所有PHP頁面頁腳中:

mysql_close(); 

通常情況下你的錯誤信息是不關閉MySQL連接,並保持在保持服務器端的連接。但是,這只是我很久以前的愚蠢編碼錯誤。 如果關閉mysql連接也無法解決你的問題。 我想你需要登錄到服務器來改變一些php.ini的設置來增加連接用戶的價值。 我希望我的回答能幫助你解決問題。

+1

謝謝你試圖提供答案,但我的問題與缺少mysql_close()調用無關。 – Josh