sockets - 如何解决 java.net.SocketException MESSAGE : Too many open files

标签 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)

最佳答案

套接字连接被视为文件,它们使用文件描述符 (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/

相关文章:

部署后 Angular 代码未在服务器上运行

java - 在嵌入式tomcat中设置响应编码

java - 如何在端口 8080 上运行时发布 tomcat webapp?

google-maps - 静态谷歌地图的标签限制

php - MYSQL select comments, limit 3, 'click to see all' 同页显示。 PHP

mysql - 如何限制唯一id出现的次数

Windows 上的 C Socket 编程在监听时出现错误,但没有 errno

java - Android - 套接字关闭速度不够快

sockets - boost async_accept无法与boost asio use_future选项一起使用

c++ - C服务器套接字接受没有请求的客户端