我们在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)
答案 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。