簡體   English   中英

連接池是否有益於多線程Java程序

[英]Would a connection Pool benefit a multithreaded Java program

我有一個java進程,它啟動大約60個線程,每個線程訪問一個MySql數據庫。

使用像C3P0這樣的連接池會有好處嗎? 或者它僅適用於Web應用程序(可擴展到許多用戶)?

今天我們有長期存在的JDBC連接(每個線程一個),我的計划是在每次SQL查詢/插入之前從連接池獲取連接。

我想知道這是否會使我們的應用程序更穩定? 另外,如果我將其配置為匹配數據庫中的最大連接數,那么線程是否必須等到有空閑連接? 文檔不是很清楚(至少不適合我)。

任何指導表示贊賞!

您可能可以從連接池中受益。 “通信鏈路故障”與長期存在的JDBC連接一起使我懷疑在一段時間未使用(空閑)后連接中斷。

HikariCP這樣的數據庫連接池為您做了兩件事可以提供幫助:

  • 在交付之前檢查連接是否有效。 如果它無效,則將其丟棄,並分發另一個有效的新連接。 這一切都是由池完成的,您的應用程序不必處理這個問題。
  • 通過關閉空閑連接(“idleTimeout”)和循環長期連接(“maxLifetime”)來保持連接的健康。 當糟糕的網絡組件(防火牆)丟棄任何打開時間超過(例如30分鍾)的連接時,后者尤其有用。(*)

如果使用了池中的所有連接,則線程可能必須等待(“connectionTimeout”)。 但是,如果您的池具有適當的最大大小(“maximumPoolSize”),這將很少很長時間。 它確實需要您的應用程序最小化它使用連接的時間:在獲取連接和關閉連接(返回到池的連接)之間,您的應用程序應該主要/僅執行數據庫操作。 副作用是您將需要更少的連接:現在使用60,您可能會發現您只需要6個池。 需要進行一些性能測試,以確定適合您應用的“maximumPoolSize”。

我建議您嘗試使用和不使用連接池進行“拔出”測試。 運行您的應用程序並為其提供一些操作,拔掉網絡電纜,而不是重新插入網絡電纜並查看應用程序恢復所需的時間。 在池中,只要池能夠創建與數據庫的新連接,您就應該再次看到應用程序正常運行。

(*)循環連接還有另一個原因:某些查詢可能會在數據庫服務器端生成臨時數據,並且只要連接處於活動狀態,數據庫服務器就可以保留這些數據。 這可能導致數據庫服務器的內存使用量不斷增加。 我沒有看到這種情況發生,但我知道其他人有。 在這種情況下,“maxLifetime”選項非常有用。

暫且不談運行應用程序的位置以及是否將數據庫暴露給互聯網,我認為添加連接池不會解決您的問題,但它可以改善您的應用程序。

我猜你在使用數據庫連接時發生了虛假錯誤。 我不承認您的特定錯誤,但它聽起來像是某種類型的連接失敗,如果您與數據庫之間的鏈接不可靠或緩慢,則可能會發生這種情況。 游泳池在這里沒有幫助,因為它是一個連接池。 獲得連接后,由於同樣的原因,您不知道它是否會失敗。

但是,如果您使用池,則不必長時間保持連接打開。 使用池時,您要求建立連接,如果沒有,則會創建一個連接。 返回連接后,如果連接暫時沒有使用,它可能會(斷開連接)並處理掉。 除非您的應用程序使用每個連接都是常量,否則這對您的應用程序和服務器都有好處。

即使在這里,你也必須做一些額外的事情來處理失敗。 假設您已經從池中獲取了連接,並且隨后失敗了。 您可以關閉它,並向池請求新連接(池中應該有一些API來擺脫該連接。)新連接可能處於更好的狀態。

最后,考慮一下也許不要在互聯網上使用JDBC。 正如其他人可能指出的那樣,這會讓自己面臨不必要的風險。 也許使用某種Web服務來通過安全的https和更受限制的界面讀取和寫入數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM