2015-03-25 124 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

相关问题