在简单JDBC查询中,Oracle驱动程序的外部更新是否可见



我一直在尝试了解从不同会话进行的更新将如何影响运行中的程序使用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连接),我更新这个表(或从中删除一行)并提交更新。

在那之后,我通过代码查询表,但没有看到更新的结果,我一直看到旧的值。我重复我的测试,结果总是回到旧的值。

我停止了正在运行的程序,在没有任何更改的情况下重新启动它,在重复测试后,我看到了更新的值。

怎么回事?我没有设置任何明确的缓存机制,查询数据库的代码尽可能简单。是否有默认的缓存?我怎么能保证我总是看到最新的值,无论哪个会话更改了它们?

编辑:有一件事我一开始没有提到:当这件事出现时,我的第一个想法显然是"哦,我忘了承诺",然后又承诺了。没有变化。在我的本地机器上用代码运行测试,看到了新的值。在服务器中运行,没有看到。

只有在COMMIT时才会发生更改。在你这么做之前,你看不到变化。之后你可以看到变化。

最新更新