2013-01-05 8 views
0

我們在Grails應用程序中使用DBCP。該數據庫位於另一臺服務器上,因此TCP/IP將在此處播放。我們經常通過顯示流程列表來監控數據庫,並且我們從未見過超過50個連接。然而,客戶端上的套接字增長很快(我看到了超過2700個)。他們大多數處於TIME_WAIT狀態。帶DBCP的MySQL正在創建大量的套接字,獲取NoRouteToHostException

所以最終我們得到一個NoRouteToHostException,因爲它無法打開套接字。

請注意,在這個用例中,我們在不到一分鐘的時間內將數據庫命中了超過40,000次。

有沒有人有建議,爲什麼這可能是?我認爲,由於我們的連接池被限制爲100(我們只能看到大約50個連接打開),我只能看到略多於50個連接,因爲偶爾可能會失效。但我們看到數千人。這是預期的嗎?或者關於我們在看這種情況時可能錯過的其他提示?

這裏是我們使用的是DBCP設置:

 properties { 
      maxActive = 100 
      maxIdle = 4 
      minIdle = 1 
      initialSize = 1 
      minEvictableIdleTimeMillis = 60000 
      timeBetweenEvictionRunsMillis = 60000 
      maxWait = 10000 
      removeAbandoned = true 
      removeAbandonedTimeout = 60 
      validationQuery = "/* PING */ SELECT 1" 
      testOnBorrow = true 
      testWhileIdle = true 
      numTestsPerEvictionRun = -1 
      logAbandoned = true 
     } 

另外請注意,我們使用autoReconnect的= TRUE在連接字符串,但我們正在考慮放棄它(我們會過時連接過夜,否則)。

謝謝!

回答

0

好的,所以我能夠整理出來。原來我誤解了maxIdle以及它是如何工作的。

任何返回到maxIdle之上的池會立即釋放。所以大部分連接都被關閉並重新打開,因此套接字耗盡。