我一直试图了解从不同会话进行的更新将如何影响正在运行的程序所持有的会话,使用 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 连接),我更新了这个表(或从中删除一行)并提交更新。
在那之后,我通过代码查询表,但我没有看到更新的结果,我一直看到旧值。我重复我的测试,结果不断返回旧值。
我停止正在运行的程序,再次启动它而不做任何更改,重复测试后,我看到了更新的值。
这是怎么回事?我没有设置任何显式的缓存机制,查询数据库的代码尽可能简单。是否有任何默认缓存正在进行?我怎么能保证我总是看到最新的值,不管哪个会话改变了它们?
编辑:一开始我没有提到的一件事:当这出现时,我的第一个想法显然是“哦,我忘了提交”,然后再次提交。没有变化。在我的本地机器上使用代码运行测试,看到新值。跑在服务器上,没看到。