2015-03-25 270 views
1

我們有一個運行在Tomcat7和MySQL5數據庫中的Struts2 web應用程序。再次如何解決java.net.SocketException消息:打開的文件太多

java.net.SocketException: Too many open files 

如果我們重新啓動Tomcat,它工作了一段時間,然後將問題重生:在網站上瀏覽了一下之後,我們得到了異常。

有人能幫我解決這個問題嗎?

堆棧跟蹤:

java.net.SocketException: Too many open files 
at java.net.Socket.createImpl(Socket.java:387) 
at java.net.Socket.<init>(Socket.java:361) 
at java.net.Socket.<init>(Socket.java:208) 
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256) 
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271) 
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771) 
at com.mysql.jdbc.Connection.<init>(Connection.java:1555) 
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) 
at org.apache.tomcat.dbcp.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) 
at org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) 
at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1185) 
at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79) 
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 

回答

1

套接字連接被處理像文件,並且它們使用文件描述符(FD),這是一種有限的資源。當一個程序(不一定程序,也許只是Tomcat的服務太多連接)打開和關閉連接過多在短時間內,您將獲得:

java.net.SocketException異常:太許多打開的文件

這是由於這樣的事實的連接,關閉後,可以在一個有點TIME_WAIT狀態(在Linux上60秒後,在Windows上4分鐘),因此保持FD鎖定。當你用完了文件描述符,你得到的例外,那基本上意味着

太多套接字連接在很短的時間跨度開

的限制,對每個操作系統的不同,可以進行檢查用命令,例如。在Unix/Linux上:

ulimit -n 

然後簡單地提高限制,例如。在Unix/Linux編輯文件

在/etc/security/limits.conf

在文件的結尾處添加下列行:

USR hard nofile 13370 
USR soft nofile 13370 

與用戶更換USR Tomcat使用的名稱,13370以及您想要設置的新限制。

如果上述更改不夠,您可能需要執行其他操作,請按照this Q&A

remember to reboot

相關問題