2017-11-17 5 views
0

Javaの準備文に問題があります。例外は非常に明確であるように思わ:3つのサーバーの1つでのみ発生するSQL例外

Root Exception stack trace: com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getGeneratedKeys(SQLServerStatement.java:1973) at org.apache.commons.dbcp.DelegatingStatement.getGeneratedKeys(DelegatingStatement.java:315)

それは基本的に我々はそれが実行される前にクエリ結果をフェッチしようとしていると述べています。妥当と思われる。この例外を引き起こすコードは次のとおりです。

... 

    preparedStatement.executeUpdate(); 

    ResultSet resultSet = preparedStatement.getGeneratedKeys(); 
    if(resultSet.next()) { 
     retval = resultSet.getLong(1); 
    } 

    ... 

ご覧のとおり、この文を実行した後でクエリ結果を取得します。

この場合、私たちはちょうど正常に実行されたINSERTクエリのResultSetから生成されたキーを取得しようとします。

問題

我々は(ドッカ容器に、負荷分散)三つの異なるサーバー上でこのコードを実行します。奇妙なことに、この例外のみが3番目のドッカーサーバーで発生します。他の2つのドッカーサーバーは、が決してになりました。

追加:失敗したクエリは1日約13000回実行されます。 (4500はサーバ3で処理されます)ほとんどの場合、クエリはサーバ3でもうまく機能します。時には、一日20回と言えば、クエリは失敗します。常に同じクエリ、常に同じサーバー。決して他のサーバーの1つ。我々はソフトウェアのバージョンを確認し

  • を試してみた何

    。しかし、すべてのサーバーが同じドッカー画像で実行されているため、これはすべて同じです。

  • 我々は、すべて私たちのPreparedStatementsPreparedStatement.RETURN_GENERATED_KEYSパラメータを用いて構築した場合は我々がチェックするJava
  • ため、最新のMicrosoft SQLドライバに更新しました。

ドッカーの画像がすべて同じであるため、サーバー構成に関連する問題があるようです。しかし、私たちは原因を見つけることができません。誰にも問題の原因を教えてもらえますか?または誰もこの問題で走ったことがありますか?

答えて

0

私が知っているように、バッチ実行の場合のgetGeneratedKeys()はSQL Serverではサポートされていません。ここで

はまだ満たされていない機能のリクエストです: https://github.com/Microsoft/mssql-jdbc/issues/245

私の提案はあなたにいくつかの理由で第三のサーバのバッチ挿入がcontitiously実行された場合、これは、他の2つ上の場合には(あなたが言及した例外を引き起こす可能性があることです項目は1つだけ)

を挿入し、あなたはあなたの答えのために、この

+0

感謝をチェックするために、SQLステートメントをログに記録しようとすることができます。私はあなたの提案を試みるつもりですが、なぜ同じコードが1つのサーバーで失敗し、他のサーバーで失敗したのか説明しません。 – Harrie

関連する問題