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

时间:2012-07-22 16:05:09

标签: java oracle jdbc

我一直试图了解如何使用带有Oracle驱动程序的JDBC(ojdbc6.jar,db version 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 个答案:

答案 0 :(得分:0)

只有在您执行COMMIT时才会发生更改。在此之前,您无法看到更改。之后你可以看到变化。