使用 jdbc 和 oracle 驱动程序时存储结果集的位置
2022-09-04 03:37:50
一旦我将jdbc与预言机驱动程序一起使用并运行选择查询,查询的结果是否存储在服务器中的预言机内存或文件系统或临时表?
一旦我通过获取下一行来运行下一个方法,它是否从oracle服务器内存加载到jvm内存?
如果我将结果集上的读取大小数定义为 1000,这是否意味着 1000 行从预言机加载到 JVM 上的 JDBC 驱动程序?
一旦我将jdbc与预言机驱动程序一起使用并运行选择查询,查询的结果是否存储在服务器中的预言机内存或文件系统或临时表?
一旦我通过获取下一行来运行下一个方法,它是否从oracle服务器内存加载到jvm内存?
如果我将结果集上的读取大小数定义为 1000,这是否意味着 1000 行从预言机加载到 JVM 上的 JDBC 驱动程序?
将在本地内存中提取默认行数(而不是整个结果集)。一旦你到达了读取行的最后一行(例如,通过执行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。即使这样也会进行往返,但通常比正常结果集少。但是,应考虑对应用程序执行一些性能检查。
根据确切的实现,部分结果集将被预取到 JVM 中,其中一部分将位于 Oracle 服务器的内存中,或者在请求更多行时直接从数据库中加载。
执行查询时,数据库并不总是需要在将数据返回到客户端之前读取所有行(取决于查询的访问路径,优化器的能力,数据库的功能等)。
当您在语句上设置 fetchSize() 时,您只是向 JDBC 驱动程序提示您认为它应该预取多少。JDBC 驱动程序可以自由地忽略您。我不知道Oracle驱动程序对fetchSize()做了什么。最臭名昭著的AFAIK是(或者可能是)MySQL JDBC驱动程序,除非您将fetchSize()设置为Integer.MIN_VALUE,否则它将始终获取所有行。