Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jdbc和oracle驱动程序时存储结果集的位置_Java_Mysql_Jdbc_Relational Database - Fatal编程技术网

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

Java 使用jdbc和oracle驱动程序时存储结果集的位置,java,mysql,jdbc,relational-database,Java,Mysql,Jdbc,Relational Database,一旦我将jdbc与oracle驱动程序一起使用并运行select查询,查询的结果是否存储在oracle内存或文件系统或临时表的服务器中 一旦我运行下一个方法,获取下一行,它是否从oracle服务器内存加载到jvm内存 如果我将结果集上的fetch size的数量定义为1000,这是否意味着将1000行从oracle加载到JVM上的JDBC驱动程序?执行查询后,数据将返回到JVM。JVM处理从该点开始的所有数据I/O。将在本地内存中获取默认数量的行(而不是整个结果集)。一旦到达所获取行的最后一行(

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

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


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

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

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

编辑1:

通过执行此操作,您可以看到resultset一次提取多少行(请验证语法):

编辑2:


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

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

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


在语句上设置fetchSize()时,您只是向JDBC驱动程序提示您认为它应该预取多少。JDBC驱动程序可以随意忽略您。我不知道Oracle驱动程序如何处理fetchSize()。最臭名昭著的AFAIK是(或者可能是)MySQL JDBC驱动程序,除非您将fetchSize()设置为Integer.MIN_值,否则它将始终获取所有行。

我从Oracle JDBC文档中获得:

获取大小

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


p。17-4这是一个有趣的问题。直观地说,我会说它存储在分配给JVM的内存中。有人请添加JDBC作为问题的标记,这样会有更多的视图,最终会有更好的答案。如果我在执行select语句后用1000000行运行它,我的JVM堆大小不会改变。@BlueLabel:你不应该一次选择1.000.000行。必须有更好的解决方案来解决您的问题。堆是提前分配的,它不应该增加。就像Martijn说的,如果你拉了1000000行,那么你做错了什么。我只是举个例子。因为在我执行查询并且没有在这个阶段开始检查结果集之后,它仍然在oracle或我的JVM中排序吗?我想知道,如果某人正在提取超过1M条记录,他/她怎么可能肯定是错的?
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