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

时间:2011-11-22 21:31:20

标签: java mysql jdbc relational-database

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

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

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

4 个答案:

答案 0 :(得分:9)

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

编辑1:

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

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。即使这样也会进行往返,但通常会低于正常的结果集。但是,您应该考虑对您的应用程序进行一些性能检查。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:-1)

我从Oracle JDBC文档中得到它:

  

获取大小

     

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

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

p。 17-4

答案 3 :(得分:-3)

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