我们有一个在 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)
最佳答案
套接字连接被视为文件,它们使用文件描述符 (FD),这是一种有限的资源。当一个程序(不一定是你的程序,可能只是 Tomcat 提供了太多的连接)在短时间内打开和关闭了太多的连接,你会得到:
java.net.SocketException: Too many open files
这是因为连接在关闭后可能会处于 TIME_WAIT 状态一段时间(Linux 上为 60 秒,Windows 上为 4 分钟),因此保持 FD锁定。当你用完 FD 时,你会得到异常,这基本上意味着
Too many socket connections open in a short span of time
每个操作系统的限制都不同,可以使用命令检查,例如。在 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 .
关于sockets - 如何解决 java.net.SocketException MESSAGE : Too many open files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29247845/