0

MYSQL データベースと通信する Java Web アプリケーションを構築しています。依頼が来たらやらなければならないことがいくつかあります。

まず、いくつかのデータを検証する必要があります。これには、いくつかのデータが渡され、それが正確であることを確認する静的メソッドがあります。この検証の一部では、ResultSet を返す別の静的メソッドを使用してデータベースをクエリする必要があります。

つまり、Web アプリは、queryData() を呼び出す Validate(String data) を呼び出します。

私がこれを行うと、うまくいきます。

ここで、データが呼び出された後、データベースにデータを挿入する別の静的関数を呼び出します。この挿入関数は、データを取得するためにまったく同じ queryData 関数を呼び出します (常にではありません)。

つまり、Web アプリは、queryData() を呼び出す insertData(data) を呼び出します。プログラムの流れは次のようになります

Webapp
|----> Validate()
          |-------->queryData()
           <-----------|
<---------|
|
|------>insertData()
          |-------->queryData()
           <-----------|
<---------|

queryData メソッドでローカルに定義されている PreparedStatement を使用してデータベースにクエリを実行しています

前述したように、検証メソッドは正常に機能しますが、挿入メソッドになるとアプリケーションがクラッシュします。

どちらの場合も SQL ステートメントが同一であることを再確認しました。また、結果セットのメモリ位置も出力しましたが、それらは異なる場所にあります。ただし、結果セットの isBeforeFirst() を出力すると、検証メソッドでは true ですが、挿入メソッドでは false です。

JDBC は ResultSet の複製を返しているようですが (別のメモリ位置に保存されています)、実際には最初の行の前に配置される新しい ResultSet を作成していません。

簡単な解決策は、最初にresultSetを単に前に戻すことですが、これでは問題は解決しません。resultSet が最初の前ではないことをまだ示しています。

なぜこれが起こっているのか誰にも分かりますか?

4

1 に答える 1

0

おバカさん、原因がわかりました。queryData 関数を呼び出す直前に、クエリ関数の結果が空のセットを返すように実際にデータを変更していました。queryData を呼び出した後、アプリケーションはデータの読み取りを試行し、SQLException を引き起こし、何かを変更する前にデータベースをロールバックするため、クエリ間の違いは見られませんでした。

助けようとしたすべての人に感謝します。

于 2012-08-09T18:59:48.763 に答える