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;
    }
}

これは、SQL Server 2000 データベースに約 40,000 の新しいレコードを挿入するために実行しているコードの抜粋です。このコードは、本番環境の Solaris 10 サーバーでホストされている JSP から実行されます。今年まで、このコードは約 18,000 レコードしか処理する必要がなく、問題なく動作していました。今年はいくつかの更新が行われ、詳細を省くために、現在約 40,000 レコードを処理しています。

開発中、Eclipse 内で実行されている Tomcat サーバーから、 Windows PCから (レコード セットが競合しないため) 実稼働で使用されているのと同じデータベースでこれをテストします。すべてが正しく機能し、約 40,000 件のレコードがすべてデータベースに登録されます。

サイトを運用サーバーにインストールしてテストを実行したところ、プロセスの途中で次の例外メッセージが表示されて失敗していることに気付きました。

com.microsoft.sqlserver.jdbc.SQLServerException: 接続が閉じられています。com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError (不明なソース) com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed (不明なソース) で com.microsoft.sqlserver.jdbc.SQLServerStatement.checkClosed (不明なソース) com で.microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed (不明なソース) com.microsoft.sqlserver.jdbc.SQLServerResultSet.next (不明なソース) で (ClassNameOmittedToProtectTheInnocent.java:74)

SQL Server は無制限の同時接続、無制限のタイムアウトに設定されています。クラスDbの私のコードが問題ないと仮定すると (それは Windows 側で動作しており、データが増加するまでは Solaris 側でうまく機能していたため)、チェックアウトを開始するためのいくつかのアイデアはありますか?

接続で何かが起こっているかどうかを確認するために SQL Server をトレースしようとしましたが、スタック トレースが書き込まれた後でさえ、それは生きているように見えます。

追加情報を提供できる場合は、お知らせください。できる限りのお手伝いをいたします。

4

1 に答える 1

0

データベースと結果セットの参照を閉じずに null に設定することに疑いがあります。これらを明示的に閉じます (接続プールがある場合、接続を閉じても実際には閉じられませんが、接続をプールに戻すシグナルとして機能します)。

プロセスごとに開いているファイル記述子の最大数などのリソース制限に達していて、結果セット/接続を閉じることができないことがこの問題の原因になると思います。

于 2009-07-17T22:39:45.957 に答える