發生情形:
程式持續開啟與關閉大量連線至MSQQL DB時,短時間內程式可以順利執行,但過一段時間後,程式會一直跑出SQLServerException,資料也無法寫入DB
錯誤訊息:
INFO | jvm 1 | 2011/12/16 16:09:49 | com.microsoft.sqlserver.jdbc.SQLServerException: 連接到主機 localhost 的 TCP/IP 連接已經失敗。錯誤: "Address already in use: connect。請確認連接屬性並檢查 SQL Server 的執行個體是否正在主機上執行,而且通訊埠可接收 TCP/IP 連接,同時防火牆也未封鎖連到通訊埠的 TCP 連接。"。INFO | jvm 1 | 2011/12/16 16:09:49 | at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
INFO | jvm 1 | 2011/12/16 16:09:49 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1033)
INFO | jvm 1 | 2011/12/16 16:09:49 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:817)
INFO | jvm 1 | 2011/12/16 16:09:49 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:700)
INFO | jvm 1 | 2011/12/16 16:09:49 | at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842)
INFO | jvm 1 | 2011/12/16 16:09:49 | at java.sql.DriverManager.getConnection(DriverManager.java:582)
INFO | jvm 1 | 2011/12/16 16:09:49 | at java.sql.DriverManager.getConnection(DriverManager.java:207)
排除方式:
*修改MS SQL DB主機TcpTimedWaitDelay參數值 TcpTimedWaitDelay 值決定必須經過多久之後,TCP/IP 才能釋出已關閉的連線,以及重複使用它的資源。 此關閉和釋出的間隔稱為 TIME_WAIT 狀態,或是區段生命期限上限 (2MSL) 狀態的兩倍。 在這段時間內,通往用戶端和伺服器的連線重新開啟的成本,比建立新的連線低。 縮減這個項目的值時,TCP/IP 可以更快釋出已關閉的連線,以提供更多資源給新的連線。 如果執行中的應用程式需要快速釋出、建立新連線,或多個連線在 TIME_WAIT 狀態中造成通訊量太低,因而需要進行調整的話,請調整這個參數。
預設值是 0xF0,這會將等待時間設為 240 秒(4 分鐘)。
最小的建議值是 0x1E,將等待時間設為 30 秒。請利用這個程序來檢視或自訂您的值。
- 啟動 regedit 指令,導覽至 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parametersregistry 子鍵,然後建立一個新的 REG_DWORD 值,稱為 TcpTimedWaitDelay。
- 請將這個值設為十進位的 30,也就是 Hex0x0000001e。這個值將等待時間設為 30 秒。
- 關閉登錄編輯器。
- 停止並重新啟動系統。
Data type | Range | Default value |
---|---|---|
REG_DWORD | 0x1E 0x12C ( 30–300 seconds ) | 0xF0 ( 240 seconds = 4 minutes ) |
MS SQL參考網站:http://technet.microsoft.com/en-us/library/cc938217.aspx