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 [...]

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • NewsVine
  • Reddit
  • StumbleUpon
  • Google Bookmarks
  • Yahoo! Buzz
  • Twitter
  • Technorati
  • Live
  • LinkedIn
  • MySpace
  • Print
  • Add to favorites
  • Hemidemi

Tomcat Database Connection Pool未釋放問題

Posted on 十一月 19th, 2009

Java Application Server的各家廠商幾乎都會提供Database Connection Pool的機制,Tomcat也是。Tomcat最常使用的Connection Pool Implement應該是DBCP,這一套Package已經內建在Tomcat Jarkata中,可以直接使用。
經常Programmer在使用Connection Pool的時候,忘記釋放Database Connection,因而最終使Connection Pool中的連結全部使用完,因而產生以下的錯誤訊息:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection pool error Timeout waiting for idle object.
連結未釋放,有幾個常見的原因:

有些Programmer喜歡將任何物件放在Session的類似物件中,或者讓Connection物件被其他物件Reference,因此在一個HTTP Request處理完成後Connection沒有釋放。
如果使用exception handling,請記得採用try… catch… final,並且在final block中釋放所有資源。如此在exception發生時,程式仍然會執行到final block並且確保資源釋放。

如果沒有辦法找到connection為何不釋放的原因,Tomcat提供幾個參數可以處理這個問題(下表資料來源為Apache Commons – DBCP Configuration):

Parameter
Default
Description

removeAbandoned
false
Flag to remove abandoned connections if they exceed the removeAbandonedTimout.
If set to true a connection is considered abandoned [...]

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • NewsVine
  • Reddit
  • StumbleUpon
  • Google Bookmarks
  • Yahoo! Buzz
  • Twitter
  • Technorati
  • Live
  • LinkedIn
  • MySpace
  • Print
  • Add to favorites
  • Hemidemi