2014-07-10 42 views
0

爲了解決這個問題,我將介紹我們當前的生產環境。當使用c3p0連接池時,MySQL的最佳最大連接設置是什麼

  • 每個客戶端獲得我們的春/ Hibernate應用程序
  • 每個部署得到它自己的數據庫部署。
  • 有向上300個的客戶在我們的服務器上,現在

我已經與3增量值和最大20個連接的1最小連接池大小配置C3P0。所以我的問題是,我最大的連接到MySQL應該是什麼?它應該是最大池大小乘以客戶端數量(20 * 300 = 6000)?還是應該少一點?如果c3p0有說,已經有3個連接並試圖獲得另一個連接並且MySQL處於最大狀態,會發生錯誤嗎?

我不認爲所有的客戶都會同時需要他們的最大數量,但我確實想要防止任何錯誤發生,如果發生邊緣情況。

回答

1

理論上,正如你所說,你的MySQL可以看到多達6000個連接,所以爲了安全起見,這就是答案。

但是你真的不希望它打開6000個連接。如果每個池的minPoolSize爲1,maxPoolSize爲20,則聽起來好像您期望客戶經常處於靜止狀態,但偶爾會使用量激增。除非峯值可能在時間上高度相關,否則通常的負荷應該低得多。

默認情況下,c3p0連接池將隨着負載峯值快速增長,但不會衰減。如果您在c3p0池上設置了積極的maxIdleTime或更好的maxIdleTimeExcessConnections,則可以確保靜態池保持少量連接,並降低您達到理論最大值6K的可能性。

對於MySQL設置,您可以將其設置爲6K以確保安全,或者將其設置得更低,以便在數據庫管理系統負擔過重時發現錯誤而不是緩慢。最好估計你期望的最高使用率,將MySQL max設置爲可能的兩倍,並查看你的負載預期是否被顯着地違反(即如果由於DBMS拒絕連接而發生錯誤)。

對於300個不同的數據庫,這意味着300個c3p0數據源,這可能會導致線程和線程管理中的高開銷。 c3p0的numHelperThreads默認爲3,而您不想低於此值。所以,這是需要思考的問題。

+0

通常情況下,流量不應該很高,但是我們有一個客戶,通常每天有600個請求在一個小時內爆發到大約1000到2000個請求。謝謝你的回答,但它確實有助於澄清事情。我甚至可能會減少客戶端上的最大連接數,具體取決於他們通常的忙碌程度。這是關於微調。 – Zoidberg