如何解决java.net.SocketException消息:打开的文件太多

时间:2015-03-25 05:03:54

标签: sockets tomcat limit file-descriptor ulimit

我们在Tomcat7和MySQL5数据库中运行Struts2 Web应用程序。在网站上浏览了一下之后,我们得到了例外:

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 个答案:

答案 0 :(得分:1)

套接字连接被视为文件,它们使用文件描述符(FD),这是一种有限的资源。当一个程序(不一定是你的程序,可能只是Tomcat提供太多连接)在短时间内打开和关闭太多连接时,你会得到:

  

java.net.SocketException:打开的文件太多

这是因为关闭后的连接可以处于TIME_WAIT状态(Linux上为60秒,Windows上为4分钟),因此保留FD锁定。当你用完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