項目是B/S模式,放在linux服務器上,tomcat和oracle11g在一台服務器上,tomcat讀取數據庫采用C3P0連接池,一直比較穩定,所以也沒有去管。後來把tomcat放在一台win2008下,數據庫放在另外一台win2008下。運行了半月有余,期間經常報數據庫連接錯誤,但刷新下頁面也就好了。因為是偶發問題,也沒有去關注。終於有一天徹底報錯進不了了,報錯截圖如下:
大意是與數據庫連接有問題。這才慌慌的打開數據庫服務器查看原因。數據庫貌似正常,但用sqlplus連接不上,報超過最大連接數。於是用netstat -ano ,本意是想看看監聽端口是否正常監聽。未曾想出現了四百多條 1521端口 的time_wait信息:
難怪數據庫連不上,於是就暫時先把數據庫重啟了下。查看了半個小時,數據庫連接保持在50左右,以為正常了。到了下午,放心不下,又上服務器查看了一下,乖乖,又有200多條TIME_WAIT。還好發現的早,不然過幾天肯定又得出問題。遂谷歌百度搜索一陣,貌似這個問題國內外出現不少,按照一個簡單的解決方法:
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名為TcpTimedWaitDelay的 DWORD鍵,設置為60,以縮短TIME_WAIT的等待時間
同時添加 MaxUserPort 值為 65534
之後一直就沒再出現過這個問題。我就一直納悶了,配置都差不多,難道是win系統和linux系統性能差別,我想也不可能啊,不能差這麼多。這事就一直放在心上,有天突然想起,原來linux下是因為web和數據庫放在同一台服務器上,web和數據庫是通過本地進程通訊,沒涉及到tcp協議。而後來win系統是分開兩台,兩台低層是通過TCP交流數據。由於win系統的一些默認設置,導致數據庫連接池用完後沒有及時釋放TCP的空閒數據庫連接。TCP連接就一直持續增加,慢慢超過了限制。配置了TcpTimedWaitDelay 後,TCP連接在空閒60秒後會自動釋放。因此,一般情況下就保持著50個左右的穩定連接。
我想應該是如此,有時候看著數據庫池好用,但其實還是對低層做了一個包裝。低層的設置還是要配置一下。