9

ResultSetタイプの a の動作について混乱していますTYPE_SCROLL_SENSITIVE

これについての私の理解は次のとおりです。

  1. 結果セットを返す選択クエリを実行します。最初の行の特定の列の値を出力します。
  2. 次に を実行するThread.sleep(10000)と、プログラムが 10 秒間停止します。
  3. プログラムがスリープしている間に、(SQL プロンプトを使用して) DB 内の同じ列を手動で更新します。
  4. 10 秒後、同じ列の値を結果セットの最初の行に再び出力します。

ステップ 4 では、出力された列の値がステップ 1 で出力された値とは異なることを期待していResultSetますSCROLL_TYPE_SENSITIVE

ここで何か誤解していますか?

以下は私が使用するコードです。

private void doStuff() throws Exception
{
    final String query = "select * from suppliers where sup_id=420";

    Statement stmt = this.con.createStatement(
        ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

    ResultSet rs = stmt.executeQuery(query);

    rs.next();

    System.out.println("City : " + rs.getString("city"));

    Thread.sleep(10000); // While this executes, I do a manual update !

    System.out.println("City : " + rs.getString("city"));
}
4

2 に答える 2

13

ここで何か誤解していますか?

はい。SELECTテーブルの最新の状態を取得するには、自分自身を起動するか、 を呼び出して、再度フェッチする必要がありますResultSet.refreshRow()。さらに、使用する前に のドキュメントを読んでResultSet.refreshRow()ください。そうしないと、予期しない結果が生じる可能性があります。

TYPE_SCROLL_SENSITIVEに関するドキュメントの状態、

TYPE_SCROLL_SENSITIVE

スクロール可能で、一般に他のユーザーによる変更に敏感な ResultSet オブジェクトのタイプを示す定数。

これは単に、同じ ResultSet オブジェクト内で他のユーザーが行った変更に敏感であることを意味します。この概念を理解するには、公式のJDBC チュートリアル: テーブルの更新を参照することをお勧めします。

さて、投稿を編集して、元のチュートリアルの特定の行を含めます。

スクロール可能な結果セットを使用すると、変更したい行に移動できます。タイプが TYPE_SCROLL_SENSITIVE の場合は、変更後に行の新しい値を取得できます。

于 2010-01-19T08:32:58.373 に答える