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

Java 在简单的JDBC查询中,Oracle驱动程序是否可以看到外部更新?,java,oracle,jdbc,Java,Oracle,Jdbc,我一直在试图理解,使用JDBC和Oracle驱动程序(ojdbc6.jar,db版本11.2),从不同会话进行的更新将如何影响运行程序所持有的会话。我对这里的文档感到困惑,尤其是表17-1: 假设以下代码: String SQL_QUERY = "select duration, cost from sample_table where name = ? and day = ? and type = ?"; PreparedStatement ps = connection.prepareSt

我一直在试图理解,使用JDBC和Oracle驱动程序(ojdbc6.jar,db版本11.2),从不同会话进行的更新将如何影响运行程序所持有的会话。我对这里的文档感到困惑,尤其是表17-1:

假设以下代码:

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连接),我更新这个表(或从中删除一行)并提交更新

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

我停止正在运行的程序,重新启动它,不做任何更改,重复测试后,我看到更新的值

发生什么事了?我没有设置任何显式缓存机制,查询数据库的代码非常简单。是否有任何默认缓存正在进行?我如何保证总是看到最新的值,而不管哪个会话更改了它们


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

只有在提交更改时才会发生更改。在此之前,您无法看到更改。之后您可以看到更改。

这就是您向我们展示的全部代码吗?听起来像是您更改了隔离级别(例如通过JDBC或使用ALTER会话)。我唯一没有显示的部分是获取连接,但会话没有以任何方式更改尝试明确地将隔离级别设置为READ_COMMITTED(使用ALTER会话)。但READ_COMMITTED不是默认隔离级别吗?是,但您对问题的描述表明,出于某种原因,您的程序没有使用该级别。Vitor在文章中写道:“我更新了这个表..并提交了更新”。因此,我假设他的改变正在实施(如果不是的话,这也可以解释问题)。在这种情况下,你没有理由不看到这些改变,因此你对情况的理解有问题。我假设我的理解有问题,但我确信我已经实施了这些改变。当这件事出现时,我的第一个想法显然是“哦,我忘了承诺”,然后又承诺了。没有变化。在本地机器上运行代码测试,查看新值。在服务器上运行,未看到。@VitorDeMario:“本地正常,服务器上正常”是新信息。你在最初的帖子中没有提到这一点。很明显你没有告诉我们整个故事。