JDBC と Oracle ドライバー (ojdbc6.jar、db バージョン 11.2) を使用して、別のセッションから行われた更新が実行中のプログラムによって保持されているセッションにどのように影響するかを理解しようとしています。ここのドキュメント、特に表17-1に混乱しています: http://docs.oracle.com/cd/E11882_01/java.112/e16548/resltset.htm#JJDBC28628
次のコードを想定します。
String SQL_QUERY = "select duration, cost from sample_table where name = ? and day = ? and type = ?";
PreparedStatement ps = connection.prepareStatement(SQL_QUERY);
ps.setString(1,name);
ps.setInt(2,day);
ps.setInt(3,type);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
SampleObject so = new SampleObject(); //default constructor
so.setDuration(rs.getInt(1));
so.setRate(rs.getDouble(2));
}
rs.close();
//and so on...
このクエリをいくつかの異なるパラメーターに対して数回実行し、プログラムを数時間実行したとします。
別のセッション (私の場合は sqldeveloper 接続) を介して、このテーブルを更新 (またはテーブルから行を削除) し、更新をコミットします。
その直後、コードを使用してテーブルにクエリを実行しましたが、更新された結果が表示されず、古い値が引き続き表示されます。テストを繰り返すと、結果は古い値で返され続けます。
実行中のプログラムを停止し、変更せずに再度開始し、テストを繰り返した後、更新された値が表示されます。
どうしたの?明示的なキャッシュ メカニズムは設定していません。データベースにクエリを実行するコードは可能な限り単純です。デフォルトのキャッシングは行われていますか? どのセッションで値が変更されたかに関係なく、常に最新の値が表示されることを保証するにはどうすればよいですか?
編集: 最初に言及しなかったことの 1 つ: これが表示されたとき、私の最初の考えは明らかに「ああ、コミットするのを忘れていた」であり、その後再びコミットしました。変更はありません。ローカル マシンでコードを使用してテストを実行すると、新しい値が表示されました。サーバーで実行され、表示されませんでした。