簡體   English   中英

JDBC連接池的性能比較

[英]Performance comparison of JDBC connection pools

有沒有人有任何比較不同ConnectionPool實現的性能特征的信息?

背景:我有一個應用程序,它將后台線程中的db更新運行到同一個盒子上的mysql實例。 使用數據源com.mchange.v2.c3p0.ComboPooledDataSource會偶爾給我們帶來SocketExceptions:com.mysql.jdbc.CommunicationsException:由於底層異常導致通信鏈接失敗:

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Broken pipe

STACKTRACE:

java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method)

增加mysql連接超時會增加這些錯誤的頻率。

切換到不同的連接池時,這些錯誤消失了(com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource); 但是性能可能更差,內存配置文件明顯如此(我們得到的GC比c3p0池更少,也更大)。

無論您使用什么連接池,您都需要假設連接可以隨時隨機關閉並讓您的應用程序處理它。

在“可信”網絡上具有長期數據庫連接的情況下,經常發生的是操作系統對連接打開的時間應用時間限制,或者定期運行某些“連接清理”代碼。 但是原因並不重要 - 它只是網絡生活的一部分,你應該假設連接可以“從你的腳下拉”,並相應地處理這種情況。

所以,鑒於此,我真的看不到連接池框架的意義,它不允許您以編程方式處理此案例。

(順便說一下,這是我的另一個案例,我很高興我只是編寫自己的連接池代碼;沒有黑盒子神秘地吃着記憶,而且不必四處尋找“神奇參數”...)

您可能希望查看http://jolbox.com上的一些基准數據 - 托管BoneCP的站點,這是一個比C3P0和DBCP都快的連接池。

我也用mysql和c3p0彈出了這個錯誤 - 我嘗試了各種各樣的東西,最終讓它消失了。 我不記得了,但可能解決的是autoReconnect標志a la

url="jdbc:mysql://localhost:3306/database?autoReconnect=true"

你試過Apache DBCP嗎? 我不知道c3po,但DBCP可以通過不同的方式處理空閑連接:

  • 它可以從池中刪除空閑連接
  • 它可以在一段不活動時間后對空閑連接運行查詢

它還可以通過對應用程序運行查詢來測試連接是否在將其提供給應用程序之前是否有效; 如果它獲得異常,它會丟棄該連接並嘗試使用另一個連接(如果可以,則創建一個新連接)。 方式更強大。

破管

這大致意味着另一方已中止/超時/關閉連接。 你是不是保持長時間的聯系? 確保您的代碼正確關閉finally塊中的所有JDBC資源( ConnectionStatementResultSet )。

增加mysql連接超時會增加這些錯誤的頻率。

請注意,此超時不會超過DB自己的超時設置。

暫無
暫無

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

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