2008-08-19 59 views
13

我有一個tomcat實例設置,但我在context.xml中配置的數據庫連接在不活動期間一直保持不變。Java + Tomcat,臨時數據庫連接?

當我檢查我收到以下錯誤日誌:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 從服務器成功接收was68051秒 前的最後一個包。成功發送到服務器的最後一個數據包在68051秒 之前,這比服務器配置的值 'wait_timeout'長。在應用程序中使用之前,應考慮或者過期和/或測試 連接有效性,增加 服務器配置的客戶端超時值,或者使用Connector/J 連接屬性'autoReconnect = true'來避免此問題。

這裏是context.xml的配置:

<Resource name="dataSourceName" 
     auth="Container" 
     type="javax.sql.DataSource" 
     maxActive="100" 
     maxIdle="30" 
     maxWait="10000" 
     username="username" 
     password="********" 
     removeAbandoned = "true" 
     logAbandoned = "true" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8" /> 

我使用autoReconnect的=自命像錯誤說做,但連接不斷死亡。我從來沒有見過這種情況發生過。

我還驗證了所有數據庫連接都正確關閉。

回答

8

Tomcat Documentation

DBCP使用Jakarta-共享數據庫連接池。它依賴於雅加達共同組件的數量:

* Jakarta-Commons DBCP 
* Jakarta-Commons Collections 
* Jakarta-Commons Pool 

此屬性可能會幫助你。

removeAbandonedTimeout="60" 

我使用相同的連接池的東西,我設置這些屬性,以防止它只是沒有通過tomcat配置的相同的東西。 但如果第一件事不起作用,請嘗試這些。

testWhileIdle=true 
timeBetweenEvictionRunsMillis=300000 
+0

不錯。我在context.xml中設置了參數,並且我會讓它靜置24小時。如果它不起作用,我將不接受答案。但它看起來很有前途!謝謝! – 2008-08-19 14:25:13

0

我不知道上面的回答是否確實基本上是相同的事情,但我們的一些系統使用大約一個星期一次數據庫連接,我已經看到了,我們提供了一個-Otimeout標誌或某事排序到MySQL設置連接超時。

5

只是爲了澄清究竟是什麼造成了這種情況。默認情況下,MySQL在閒置8小時後終止打開的連接。但是,數據庫連接池將保留更長的連接時間。

因此,通過設置timeBetweenEvictionRunsMillis = 300000,您正在指示連接池運行連接並每5分鐘逐出並關閉空閒連接池。

+0

此屬性的名稱是什麼?我想仔細檢查一下。我看到「thread_pool_idle_timeout = 60」。 – mass 2015-03-18 01:32:30

1

removeAbandoned選項從DBCP 1.2(儘管在1.3分支中爲still present)開始已棄用。 Here是一個非官方的解釋。