一旦我将jdbc与oracle驱动程序一起使用并运行select查询,查询的结果是存储在oracle内存或文件系统或临时表的服务器中吗?
一旦我通过获取下一行来运行下一个方法,它是从oracle服务器内存加载到jvm内存吗?
如果我将结果集上的获取大小数定义为1000,这是否意味着1000行从oracle加载到JVM上的JDBC驱动程序?
答案 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.