我在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.
我需要建议如何解决此问题并防止我的应用程序崩溃????
WorkEnvironment:
Operation System AIX
Application Server Webpshere 7.0
答案 0 :(得分:5)
听起来你有文件描述符泄漏。
您的代码的某些部分(或在计算机上运行的其他代码)正在创建越来越多的文件句柄,包括套接字,而不是关闭它们。根据您的描述,它听起来像是您的代码正在执行此操作。
我怀疑在创建套接字时,如果抛出异常,则不会干净地关闭它。如果你不这样做,那么套接字将保持打开状态,随着时间的推移,你将耗尽文件。任何需要在使用后关闭的资源都应始终在try-finally块中关闭,以确保无论通过该方法的路径如何都将关闭资源。
如果您认为自己没有泄漏文件,请使用主机上的lsof
实用程序查看您的进程正在打开哪些文件句柄,并检查您是否合法地需要所有文件句柄。我发现你没有理由超出系统的默认FD限制。
答案 1 :(得分:2)
一般来说,当你连接到数据库时,你有某种打开的调用来打开连接,然后你做一些连接工作,然后你关闭连接。如果您忘记关闭连接,则可能会快速耗尽资源并出现类似您所看到的错误。但是,即使您确实记得关闭连接,也可能在执行可能导致执行流程绕过close调用的工作时遇到异常。因此,您始终希望将工作包装在try块中,并将close调用放在finally块中。这可能是你的问题吗?
答案 2 :(得分:1)
我遇到过类似的问题。我通过在操作系统上增加用户的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