应用程序请求者无法建立连接.(打开的文件太多)

Adi*_*ing 1 java mysql websphere aix hibernate

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

每隔5分钟,我的线程就会尝试从应用服务器机器的不同主机获取MySQL数据库中的一些数据.

当MySql数据库的主机关闭时,工作管理器总是尝试连接到MySQL数据库,我知道我的程序将始终获得异常连接失败.这是例外:com.mysql.jdbc.CommunicationsException:

Communications link failure due to underlying exception
Run Code Online (Sandbox Code Playgroud)

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

java.sql.SQLException: The application requester cannot establish the connection. (Too many open files)
Run Code Online (Sandbox Code Playgroud)

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

[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.
Run Code Online (Sandbox Code Playgroud)

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

工作环境:

Operation System AIX
Application Server Webpshere 7.0
Run Code Online (Sandbox Code Playgroud)

And*_*yle 5

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

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

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

如果您认为自己没有泄漏文件,请使用lsof主机上的实用程序查看您的进程正在打开哪些文件句柄,并检查您是否合法地需要所有文件句柄.我发现你不太可能有合理的理由超过系统的默认FD限制.