2014-03-07 109 views
1

在我的web應用程序的context.xml文件,我用:Tomcat連接池配置:屬性設置。示例和建議

<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" 
      removeAbandoned="true" removeAbandonedTimeout="60" 
      maxActive="30" maxIdle="30" maxWait="10000" 
      username="myuser" password="mypwd" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/mydb" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" closeMethod="close" 
      validationQuery="select 1" testOnBorrow="true" /> 

它的工作原理,但我真的不知道,如果30個simoultaneous連接是足夠的(Web應用程序就像是一個拍賣並且還有管理訪問權限)。

而且我不知道,如果

removeAbandonedTimeout="60" 

實在是太多了,它應如何計算。

是否有關於連接池場景的任何文章/文章,關於如何平衡資源屬性?

回答

2

如何配置數據庫連接池取決於使用它的應用程序的特性。我可以提供一些提示,但最終你將不得不通過(加載)測試找到自己。

首先仔細閱讀documentation。例如,removeAbandoned選項是不會關閉/返回到池的連接的錯誤代碼的回退(來自文檔:Setting this to true can recover db connections from applications that fail to close a connection)。如果使用removeAbandoned,則應在測試應用程序時使用logAbandoned(設置爲true)。 removeAbandonedTimeout應該調整爲最長的查詢(來自文檔:The value should be set to the longest running query your applications might have.)。

問你的DBA他是否喜歡空閒連接上的新連接,並相應地調整minEvictableIdleTimeMillis(某些DBA比較少有新連接(例如1小時的空閒超時)而其他人則希望空閒連接儘快關閉(例如空閒超時30秒))。

10秒鐘的A maxWait對於生產來說可能太低。我將它保持在50秒(數據庫用於報告死鎖的超時),以便網絡和數據庫hickup(將發生)不會導致應用程序錯誤。另一方面,當(負載)測試時,將此值設置得較低(如3秒)以指示池何時太小(即maxActive太低)。

如果應用程序管理員需要保證訪問權限,則需要另一個(第二個)池來爲這些特殊用戶提供服務。否則,不能保證他們可以'進入',並且當出現問題並且常規池已經完全耗盡時,他們可能必須進入。

我以前也說過負載測試,一些額外的指針:

  • 確保測試數據庫爲代表的生產數據庫。在生產數據庫上運行較長的查詢必須在測試數據庫上運行很長時間。
  • 調試池參數測試(所以你注意到奇怪的行爲快)和生產(使其儘可能穩定,並確保你會注意到非常糟糕的事情)。
  • 直到您開始注意到吞吐量(或批處理運行時間)的實際差異時,重複加載測試批次運行的值較低,爲maxActive。例如,我最近測試了一個具有24個線程的應用程序,它們都在執行數據庫操作,並以最大池大小16開始。然後執行最大池大小爲8的運行,並且幾乎沒有任何區別。然後做了一個最大池大小爲4的跑步,並注意到了一個區別。所以最大池大小爲8就足夠了。

一些技巧以提高效率:

  • 確保租賃和釋放連接之間的所有代碼只做數據庫操作(例如,沒有記錄,它吮吸時間,因爲它刷新到磁盤上的文件)。
  • 確保連接在finally塊中釋放/關閉,以便連接不會從池中泄漏。
  • 在從池中租用連接之前準備查詢中使用的所有數據。

快樂的負載測試...

+0

怎麼樣'maxIdle'?從文檔來看,我沒有成功地理解它在'maxActive'方面的角色。 – Sefran2

+0

@Cricket找到了一個[question](http://stackoverflow.com/q/22262892/3080094),它反映了我對'maxIdle'和'maxActive'之間關係的理解。我從來沒有測試過它,所以希望有人能夠通過對相關問題的回答進行確認。 – vanOekel