【问题标题】:How to resolve java.net.SocketException MESSAGE: Too many open files如何解决 java.net.SocketException MESSAGE:打开的文件太多
【发布时间】:2015-03-25 05:03:53
【问题描述】:

我们有一个在 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)

【问题讨论】:

    标签: sockets tomcat limit file-descriptor ulimit


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      相关资源
      最近更新 更多