0

JTDSを使用してMS-SQL2005に接続しています。Springで構成されたDB接続プールとしてc3p0を使用しています。

Invalid state, the ResultSet object is closed接続プールへの参照を渡したGroovyスクリプトでSQLExceptionがランダムに発生します。スクリプトはタイマーによって頻繁に実行されます。ランダムとは、スクリプトが99%の確率で完全に機能することを意味しますが、失敗した場合は2、3回機能し、その後再び正常に機能し、中断したところから再開します。重要な作業はすべてトランザクションで行われ、メッセージキューを引き出します。

以下のロジック:

    //passed into the groovy context
    DataSource source = source;
    Connection conn = source.getConnection();

    ...
    //Have to omit proprietary DB stuff... sorry...
    PreparedStatement fooStatement = conn.prepareStatement("INSERT INTO foo (x,y,z) VALUES (?,?,?) select SCOPE_IDENTITY();");        
    ResultSet identRes = fooStatement.executeQuery();

    //This is where the execption is thrown.
    identRes.next();

    ...

    try{
         log.info("Returning SQL connection.");
         conn.close();
    }catch(Exception ex){}

同様のGroovyスクリプトを実行する別のタイマースレッドがありますが、この問題は発生していません。そのスクリプトは、同様の呼び出しを使用して接続を取得し、接続を閉じます。

当初、2番目のスクリプトは、プールから同じ接続を取得し、最初に終了してから接続を閉じている可能性があると考えていました。しかし、c3p0のドキュメントには、呼び出しconn.close()は単にプールに戻す必要があると書かれています。

他の誰かがこれを見たことがありますか、それとも私はここで何か大きなものを見逃していますか?

ありがとう。

4

1 に答える 1

2

これを解決しました...C3P0は、30秒より長くチェックアウトされた接続をドロップするように構成されました。これは、データベースのデッドロックを防ぐためです(チューニングは制御しません)。トランザクションの1つが完了するまでに非常に長い時間がかかり、C3P0が接続をドロップしていたため、ResultSetClosedエラーが発生しました。ただし、驚いたことに、C3P​​0はインシデントをログに記録していなかったため、アプリケーションのログにはこれが表示されませんでした。

于 2011-11-14T21:24:53.750 に答える