使用jdbc和oracle驱动程序时存储结果集的位置

一旦我使用带有oracle驱动程序的jdbc并运行select查询,查询的结果是存储在oracle内存或文件系统或临时表的服务器中?

一旦我通过获取下一行运行下一个方法,它是从oracle服务器内存加载到jvm内存吗?

如果我将结果集上的获取大小数定义为1000,这是否意味着1000行从oracle加载到JVM上的JDBC驱动程序?

将在本地内存中提取默认行数(不是整个结果集)。 一旦到达获取行的最后一行(比如通过执行next()并尝试访问下一行),如果结果中有更多行,则将对数据库进行另一次往返调用以获取下一行一批行。

编辑1:

您可以通过执行此操作来查看结果集一次获取的行数(请validation语法):

rs.beforeFirst(); // will put cursor before the first row rs.last(); // will put cursor after the last line int noOfRows = rs.getRow(); // will give you the current row number 

编辑2:

如果要在本地内存中获取比平时更多的行,可以考虑使用CachedRowSet 。 即使这样也会进行往返,但通常会低于正常的结果集。 但是,您应该考虑对您的应用程序进行一些性能检查。

根据具体实现,结果集的一部分将被预取到JVM中,其中一部分将在Oracle服务器的内存中,或者在请求更多行时从数据库中加载。

在执行查询时,数据库并不总是需要在将数据返回到客户端之前读取所有行(取决于查询的访问路径,优化器的能力,db的function等)。

在Statement上设置fetchSize()时,您只是向JDBC驱动程序提示您认为它应该预取多少。 JDBC驱动程序可以忽略您。 我不知道Oracle驱动程序对fetchSize()的作用。 最臭名昭着的AFAIK是(或者可能是)MySQL JDBC驱动程序,它总是会获取所有行,除非你将fetchSize()设置为Integer.MIN_VALUE。

我是从Oracle JDBC文档中得到的:

获取大小

默认情况下,当Oracle JDBC运行查询时,它会从数据库游标中一次检索10行的结果集。 这是默认的Oracle行提取大小值。 您可以通过更改行获取大小值来更改每次访问数据库游标时检索的行数。 标准JDBC还允许您为查询指定每个数据库往返提取的行数,并且此数字称为提取大小。 在Oracle JDBC中,行预取值用作语句对象中的缺省提取大小。 设置提取大小会覆盖row-prefetch设置,并影响通过该语句对象运行的后续查询。 获取大小也用在结果集中。 当语句对象运行查询时,语句对象的提取大小将传递给查询生成的结果集对象。 但是,您还可以在结果集对象中设置提取大小,以覆盖传递给它的语句提取大小。

https://docs.oracle.com/cd/E11882_01/java.112/e16548.pdf

页。 17-4

执行查询后,数据将返回到JVM。 JVM处理该点的所有数据I / O.