2009-12-08 212 views
7

我已經設置tomcat使用連接池,但在mysql連接超時之後,以前在池中打開的連接沒有打開。以下是我的context.xml文件的樣子:JDBC連接池不能重新連接tomcat中的連接

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource" 
      maxActive="5" maxIdle="3" maxWait="10000" 
      username="uname" password="password" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/> 

正如你可以看到我已經包括autoReconnect爲true,但它沒有。我已經在8小時後檢查了數據庫上的進程,這是超時設置。 如果任何人都可以幫助,那麼請幫助我,因爲這是幾個月來的問題,但由於我的軟件很快就會出現,它已經出現緊急情況。
由於提前 院長切斯特

回答

6

嘗試添加驗證查詢屬性。這應該有這樣的超時後自動關閉和重新打開連接的效果:

validationQuery="SELECT 1" 
+0

我在另一個論壇上得到了這個解決方案,並且已經這樣做了。 – Dean 2009-12-10 15:59:07

+0

validationQuery是不夠的。請閱讀:http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html – 2013-11-05 20:37:02

+0

'testWhileIdle'和'test-on-borrow'屬性將使用validationQuery – 2017-01-10 07:05:08

1

由於這是迫切和生產,我建議你看一下一個體面的連接池,如c3p0。它更健壯,更可靠,可以更好地處理超時。

5

首先,擺脫autoReconnect屬性。您不需要連接池,這可能會導致問題。

其次,確保您接近所有資源(ConnectionStatementResultSet)在finally塊JDBC代碼。

我不確定這是否適用於您的案例,但初創公司之間常見的誤解是,他們似乎認爲您不需要關閉連接池中的資源。這是不真實的。連接池是一個包裝(裝飾),在其周圍有微微一變close()方法連接這大致模樣

public void close() throws SQLException { 
    if (this.connection is still active) { 
     do not close this.connection, but just return it to pool for reuse; 
    } else { 
     actually invoke this.connection.close(); 
    } 
} 

與其他詞,關閉它們釋放了池連接,以便它可以被放回在池中供未來重用。如果您在不關閉連接的情況下獲取連接,那麼該池遲早會耗盡連接。

0

使用您的配置,如果它閒置,它不應該創建另一個連接。嘗試添加

minIdle="3" 

使用此設置,DBCP將始終保持3個連接。

我們看到與輕度使用的服務器完全相同的行爲。由於默認的連接超時時間爲8小時,因此我們在早上進來時看不到任何連接。這就是我們所期望的。但是,有時我們會看到過時的連接,並且第一個請求會失敗。要解決此問題,需要添加以下屬性,請嘗試添加以下屬性:

testWhileIdle="true", 
timeBetweenEvictionRunsMillis="60000"