Tomcat + Microsoft SQL Server: Connect Reset By Peer錯誤訊息
Posted on 二月 1st, 2010
如果你的Web應用程式用Connection Pool連接資料庫,並且有時會發生Connect Reset by Peer錯誤訊息,就像這樣:
java.sql.SQLException: IO 異常: Connection reset by peer: socket write error
在你懷疑你的Application Server與資料庫的連線不穩定之前,請先在你的Data Source中加入以下參數(適用於Tomcat + SQL Server):
validationQuery=』SELECT 1″
validationQuery的用途是,在你的應用程式可以使用某個Connection Pool之前,DBCP會先使用validationQuery詢問Database Server,用意在檢查這個Database Connection是否仍可使用。如果不能使用,DBCP會再找下一個Database Connection,或者建立新的Database Connection讓應用程式使用。
所以,validationQuery的值必須是一個傳回一行結果的SQL。當然,執行的速度越快越好。
對於其他的Database Server,請發揮想像力。像是Oracle,你可以用SELECT 1 FROM dual。
我記得對於其他的Application Server,也有相對應的參數。請自行尋找Application Server文件。
至於,為甚麼Connection Pool裡的Connection,明明已經建立好了,為甚麼會被中斷?原因很多,也許真的是網路不穩,但是在正式環境中的應用程式,必須能考慮到可能的環境變化。一般來說,你不會希望你的應用程式後台的資料庫重開後,前台的Application Server也必須重開才能運作正常吧?如果能夠自動恢復運作,寫系統的人才不會隨時被Call,不是嗎?
DBCP設定資訊來自於DBCP – Configuration。節錄如下:
Parameter
Default
Description
validationQuery
The SQL query that will be used to validate connections from this pool before returning them to the caller. If [...]




