Java 从Oracle DB获取可滚动的结果集

Java 从Oracle DB获取可滚动的结果集,java,oracle,jdbc,resultset,Java,Oracle,Jdbc,Resultset,我们在团队中使用jdbc与Oracle DB服务器紧密合作。在我们的一个更改中,我调用了一个存储过程,它返回两个不同的结果集。起初,我的实现假设默认的滚动能力。 失败后,我在网上查了一下 我所能读到的所有关于它的内容基本上都是一样的:使用prepareStatement或prepareCall方法,并使用适当的类型\u SCROLL\u INSENSITIVE和CONCUR\u read\u。这些都不起作用 我使用的存储过程再次返回两个不同的结果集,并通过ResultSet rs.getObje

我们在团队中使用jdbc与Oracle DB服务器紧密合作。在我们的一个更改中,我调用了一个存储过程,它返回两个不同的结果集。起初,我的实现假设默认的滚动能力。 失败后,我在网上查了一下

我所能读到的所有关于它的内容基本上都是一样的:使用prepareStatement或prepareCall方法,并使用适当的类型\u SCROLL\u INSENSITIVE和CONCUR\u read\u。这些都不起作用

我使用的存储过程再次返回两个不同的结果集,并通过ResultSet rs.getObjectname提取它们。通常在示例中,它们的结果集会立即从.executeQuery返回。 我的问题是,prepareCall方法中的可滚动性/可更新性类型是否会影响这些结果集?如果是,我如何获得它们

我知道JDBC驱动程序会降低我对ScrollableResultSet的请求。如何判断我的结果集是否已降级


请注意,为什么默认情况下结果集不能滚动?最佳做法是什么?灵活性的成本是什么?

在Oracle中,游标是一种仅向前的结构。数据库所知道的就是如何很好地获取下一行,从技术上讲是获取下n行。为了使结果集看起来可以滚动,您需要依赖JDBC驱动程序

JDBC驱动程序有两种使ResultSet看起来可滚动的基本方法。第一种方法是在获取数据时将整个结果集保存在内存中,以防您想要返回。从功能上讲,这是可行的,但当查询可能返回相当数量的数据时,可能会对性能和可伸缩性造成灾难性的后果。当某段代码第一次因为一个查询返回了数千行(其中包含一堆长注释字段)而开始占用应用服务器上的GB内存时,JDBC驱动程序将被正确地嘲笑为资源猪

更常见的方法是让驱动程序向查询中添加一个键,并使用该键管理驱动程序缓存的数据。因此,例如,驱动程序可能会将最后1000行全部保留在内存中,但只缓存早期行的键,以便稍后可以返回并重新获取该数据。这对代码来说更复杂,但它还要求ResultSet具有唯一的键。通常,这是通过尝试向查询中添加ROWID来完成的。例如,这就是为什么Oracle JDBC驱动程序指定一个可滚动或可更新的结果集,但可以使用SELECT alias.*-后者使得驱动程序可能会盲目地向查询中添加ROWID列

但是,来自存储过程的ResultSet对驱动程序来说是完全不透明的-它无法获取用于打开ResultSet的查询,因此无法添加额外的键列或返回并再次获取数据。如果驱动程序想要使结果集可滚动,它必须返回到将整个结果集缓存在内存中。从技术上讲,这是完全可能做到的,但很少有司机会这么做,因为这往往会导致性能问题。降级结果集更安全。大多数情况下,应用程序能够更好地判断缓存整个结果集是否合理,因为您知道它只会返回少量数据,或者能够返回并通过其自然键再次获取行


您可以在ResultSet上使用getType和getConcurrency方法来确定驱动程序是否已降级ResultSet。

在Oracle中,游标是仅向前的结构。数据库所知道的就是如何很好地获取下一行,从技术上讲是获取下n行。为了使结果集看起来可以滚动,您需要依赖JDBC驱动程序

JDBC驱动程序有两种使ResultSet看起来可滚动的基本方法。第一种方法是在获取数据时将整个结果集保存在内存中,以防您想要返回。从功能上讲,这是可行的,但当查询可能返回相当数量的数据时,可能会对性能和可伸缩性造成灾难性的后果。当某段代码第一次因为一个查询返回了数千行(其中包含一堆长注释字段)而开始占用应用服务器上的GB内存时,JDBC驱动程序将被正确地嘲笑为资源猪

更常见的方法是让驱动程序向查询中添加一个键,并使用该键管理驱动程序缓存的数据。因此,例如,驱动程序可能会将最后1000行全部保留在内存中,但只缓存早期行的键,以便稍后可以返回并重新获取该数据。这对代码来说更复杂,但它还要求ResultSet具有唯一的键。通常,这是通过尝试向查询中添加ROWID来完成的。这就是为什么,例如,Oracle JDBC驱动程序指定 可滚动或可更新的ResultSet,但可以使用SELECT alias.*-后者使驱动程序可能会盲目地向查询中添加ROWID列

但是,来自存储过程的ResultSet对驱动程序来说是完全不透明的-它无法获取用于打开ResultSet的查询,因此无法添加额外的键列或返回并再次获取数据。如果驱动程序想要使结果集可滚动,它必须返回到将整个结果集缓存在内存中。从技术上讲,这是完全可能做到的,但很少有司机会这么做,因为这往往会导致性能问题。降级结果集更安全。大多数情况下,应用程序能够更好地判断缓存整个结果集是否合理,因为您知道它只会返回少量数据,或者能够返回并通过其自然键再次获取行


您可以在ResultSet上使用getType和getConcurrency方法来确定驱动程序是否已降级您的ResultSet。

我非常高兴您的链接中附带了Oracle API。到目前为止,我在错误的地方寻找如此广泛的答案。但是,关于降级,getType和getConcurrency只允许我查询ResultSet属性。我更感兴趣的是检查指示执行了此类降级的标志。这是因为我不确定我是否正确地指示JDBC使用可滚动结果集。不过,我认为可以从这里查询oracle的文档。Vielen DankI非常高兴在您的链接中附加了Oracle API。到目前为止,我在错误的地方寻找如此广泛的答案。但是,关于降级,getType和getConcurrency只允许我查询ResultSet属性。我更感兴趣的是检查指示执行了此类降级的标志。这是因为我不确定我是否正确地指示JDBC使用可滚动结果集。不过,我认为可以从这里查询oracle的文档。越南