【问题标题】:The application requester cannot establish the connection. (Too many open files)应用程序请求者无法建立连接。 (打开的文件太多)
【发布时间】:2011-03-24 00:26:43
【问题描述】:

我开发在 Websphere 工作管理器中运行的应用程序。工作管理器用于在 webpshere 应用程序服务器中运行线程。

我的线程每 5 分钟尝试从来自应用服务器机器的不同主机的 MySQL 数据库获取一些数据。

MySql 数据库主机关闭时,工作管理器总是尝试连接 MySQL 数据库,我知道我的程序总是会出现异常连接失败。这是例外:com.mysql.jdbc.CommunicationsException:

Communications link failure due to underlying exception

但是,随着时间的推移,我的程序会出现如下异常:

java.sql.SQLException: The application requester cannot establish the connection. (Too many open files)

这个异常使我的应用服务器崩溃:

[8/2/10 9:07:21:613 ICT] 00000d54 prefs         W   Could not lock User prefs. Unix error code 24.
[8/2/10 9:07:21:613 ICT] 00000d54 prefs         W   Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.

我需要建议如何解决此问题并防止我的应用程序崩溃????

工作环境:

Operation System AIX
Application Server Webpshere 7.0

【问题讨论】:

    标签: java mysql hibernate websphere aix


    【解决方案1】:

    听起来你有文件描述符泄漏。

    您的代码的某些部分(或机器上运行的其他代码)正在创建越来越多的文件句柄,包括套接字,并且没有关闭它们。根据您的描述,听起来是您的代码在执行此操作。

    我怀疑当你创建套接字时,当抛出异常时你并没有干净地关闭它。如果您不这样做,那么套接字将保持打开状态,并且随着时间的推移您将用完文件。任何需要在使用后关闭的资源都应该始终try-finally 块中关闭,以确保无论通过该方法的路径如何,资源都会被关闭。

    如果您认为您没有泄漏文件,请使用主机上的 lsof 实用程序查看您的进程正在打开哪些文件句柄,并检查您是否确实需要所有这些句柄。我认为您不太可能有正当理由超出系统的默认 FD 限制。

    【讨论】:

      【解决方案2】:

      一般来说,当你连接到一个数据库时,你有某种打开调用来打开连接,然后你对连接做一些工作,然后你关闭连接。如果您忘记关闭连接,您可能会很快耗尽资源并收到与您所看到的错误类似的错误。但是,即使您确实记得关闭连接,您也可能在执行会导致执行流程绕过关闭调用的工作时遇到异常。出于这个原因,您总是希望将工作包装在 try 块中,并将 close 调用放在 finally 块中。会不会是你的问题?

      【讨论】:

        【解决方案3】:

        我也遇到过类似的问题。我通过增加操作系统上用户的 ulimit 来修复它。 出现这种情况是因为大多数操作系统中打开文件的数量都有限制。

        在 linux 机器上,您可以通过以下命令来完成。这里我设置为无限制。

        ulimit -u unlimited
        

        您还可以通过运行检查当前限制:

        >ulimit -a       
              core file size (blocks)   1000000
              data seg size (kbytes)    unlimited
              file size (blocks)            unlimited
              max memory size (kbytes)  unlimited
              stack size (kbytes)           8192
              cpu time (seconds)            unlimited
              max user processes            unlimited  
              pipe size (512 bytes)         8
              open files                    1024
              virtual memory (kbytes)   2105343
        

        【讨论】:

        • 你能给我更多解释为什么The application requester cannot establish the connection. (Too many open files)会发生吗?为什么 ulimit -u unlimited 命令是解决方案?谢谢
        • 已经在我的帖子中解释过“大多数操作系统中打开文件的数量都有限制”。并且每当为通信创建 Socket 时,在下划线操作系统中都会使用一个文件。 ulimit 是更改打开文件限制的命令。
        • 感谢您的回答,我会尝试您的解决方案。
        • -1:这几乎可以肯定是泄漏。您的回答类似于建议购买更多内存来解决OutOfMemoryError如果应用程序合法地需要数千个打开的 FD,那么这一步是合理的,但这应该首先通过分析来证明,直到此时默认位置应该是应用程序已损坏。
        猜你喜欢
        • 1970-01-01
        • 2018-10-08
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        • 2018-07-03
        相关资源
        最近更新 更多