2011-11-30 47 views
1

我在我的web應用程序中發現了一個問題,休眠連接沒有正確關閉。 但由於Web應用程序的複雜性,它至少需要15 - 30天。如何使用CLOSE_WAIT狀態終止tcp連接

在此期間,我想手動關閉連接。

這樣我就可以關閉這個連接而不用重新啓動tomcat了? 有一個命令可以用來殺死這個連接池嗎?

我已發現在hibernate配置錯誤,解決

#netstat -anp |grep 3306 |grep CLOSE_WAIT 
tcp  1  0 ::ffff:172.18.11.4:50750 ::ffff:172.18.11.8:3306  CLOSE_WAIT 4203/java   
tcp  1  0 ::ffff:172.18.11.4:36192 ::ffff:172.18.11.8:3306  CLOSE_WAIT 4203/java   
tcp  1  0 ::ffff:172.18.11.4:36215 ::ffff:172.18.11.8:3306  CLOSE_WAIT 4203/java   
tcp  1  0 ::ffff:172.18.11.4:36211 ::ffff:172.18.11.8:3306  CLOSE_WAIT 4203/java   
tcp  1  0 ::ffff:172.18.11.4:57820 ::ffff:172.18.11.8:3306  CLOSE_WAIT 4203/java   
tcp  1  0 ::ffff:172.18.11.4:36213 ::ffff:172.18.11.8:3306  CLOSE_WAIT 4203/java   
tcp  1  0 ::ffff:172.18.11.4:36159 ::ffff:172.18.11.8:3306  CLOSE_WAIT 4203/java 

等....

CentOS的6.0運行Tomcat 5.5和MySQL 5.5。

+1

「但考慮到Web應用程序的複雜性,它至少需要15 - 30日」 - 沒有這沒什麼與應用程序的複雜性(代碼)有關。 – symcbean

+0

準確地說,這是一個*錯誤*,您需要*修復*。 – EJP

回答

1

始終致電socket.close()。另見how to close JDBC resources properly every time

如果無法修復服務器, 添加以下行/etc/init.d/inetinit

/usr/sbin/ndd -set /dev/tcp tcp_close_wait_interval 1500 
/usr/sbin/ndd -set /dev/tcp tcp_keepalive_interval 1500 

並重新啓動。根據http://www.experts-exchange.com/OS/Unix/Solaris/Q_20568402.html

或者,在Linux上,嘗試tcpkill(部分dsniff)或cutter

+0

ndd對於solaris來說是無用的,對於centos來說呢? –

+0

'/ sbin/sysctl'? http://klaver.it/linux/sysctl.conf –

+0

sysctl -w net.ipv4.tcp_close_wait_interval = 1500 錯誤:「net.ipv4.tcp_close_wait_interval」是一個未知的密鑰 –

0

還有一些關於我現在找不到的其他問題。但你可以試試killcxcutter我找不到刀具的鏈接,但它在debian回購站中找到。確保選擇tcp連接殺手,而不是具有相同名稱的單元測試框架。

更新:似乎有一個Windows版本wkillcx UPDATE2:謝謝熊Chiamiov對切斷器連桿

+1

http://www.digitage.co.uk/digitage /軟件/ Linux的安全性/切割機 –