0

我在 Java EE Web 应用程序中调用了以下方法。

public static void submitToPending()
{
    Db db;
    ResultSet rs;

    try
    {
        db = new Db("Database.properties");

        rs = db.issueQuery(getDescriptorList());

        while (rs.next())
        {
            db.insertApplicationData(rs.getString("Id"));
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        db = null;
        rs = null;
    }
}

这是我正在运行的一小段代码,用于将大约 40,000 条新记录插入 SQL Server 2000 数据库。此代码从托管在生产环境中的 Solaris 10 服务器上的 JSP 执行。在今年之前,这段代码只需要处理大约 18,000 条记录,而且运行良好。今年进行了一些更新,并且,为了节省细节,现在处理了大约 40,000 条记录。

在开发过程中,我在Windows PC上的生产中使用的同一数据库(因为记录集不冲突)上进行了测试,该数据库来自运行在 Eclipse 内的 Tomcat 服务器。一切正常,所有 40,000 条左右的记录都进入数据库。

当我将站点安装到生产服务器并运行测试时,我注意到该过程进行到一半以上失败了,并出现以下异常消息:

com.microsoft.sqlserver.jdbc.SQLServerException:连接已关闭。com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerStatement.checkClosed(Unknown Source) at com .microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(Unknown Source) at (ClassNameOmittedToProtectTheInnocent.java:74)

SQL Server 设置为无限制同时连接、无限制超时。假设我在Db类中的代码没问题(因为它在 Windows 方面工作,并且在数据增加之前,在 Solaris 方面表现良好)有什么想法可以开始检查?

我尝试跟踪 SQL Server 以查看连接是否发生了问题,但即使在写入堆栈跟踪之后它似乎仍然存在。

如果我可以提供任何其他信息,请告诉我。我会尽我所能提供帮助。

4

1 回答 1

0

我怀疑您将数据库和结果集引用设置为 null 而不关闭它们。我会明确地关闭这些(如果你有一个连接池,关闭一个连接实际上并没有关闭它,而是作为一个信号将连接返回到池中)。

我猜您遇到了资源限制,例如每个进程打开的文件描述符的最大数量,并且无法关闭结果集/连接将是此问题的根源。

于 2009-07-17T22:39:45.957 回答