【发布时间】:2017-07-11 17:38:47
【问题描述】:
我下面有这样的代码,
try (Connection connection = this.getDataSource().getConnection();
PreparedStatement statement = connection.prepareStatement(sqlQuery);) {
try {
statement.setFetchSize(10000); // Set fetch size
resultSet = statement.executeQuery();
while (true) {
resultSet.setFetchSize(10000);
boolean more = resultSet.next();
if (! more) {
break;
}
// populating an arraylist from the value from resultSet
}
}
catch (Exception e) {
LOGGER.error("Exception : "+e);
}
} catch (SQLException e) {
LOGGER.error("Exception : "+e);
}
我的理解如下,
statement fetch size 为 10000。执行 statement.executeQuery() 时,返回 ResultSet 游标。它将在内存中有 10000 行。 当调用 resultSet.next 时,它会从内存缓冲区中获取一行。 (每次调用一行)。当内存中没有更多行时,再次触发查询,并再次从数据库中获取 10000 行并存储在缓冲区中。这一直持续到没有要从 DB 中获取的行
所以如果我的理解是正确的,总共有 210000 行会有多少实际的数据库调用?是21吗? (210000 / 10000)
还有何时和谁调用数据库(当缓冲区中的行全部被读取时)以获取更多行(在我的情况下为 10000 行)并存储在缓冲区中。还有什么时候清空缓冲区?
如果我的理解有误,请纠正我。
我需要处理 Oracle 数据库中的数百万数据。
感谢任何指针/信息
问候,
标清
【问题讨论】:
-
setFetchSize#方法应该是一个提示。使用或忽略它完全取决于 JDBC 驱动程序。who calls the DB--> 驱动程序也会这样做。大部分来自SO Q/A -
对于 OCI 驱动程序,文档中有一节描述了每次 OCI 调用的网络往返次数。 JDBC 驱动程序没有以这种方式记录 - 它提供了更高级别的 API。但是您可以使用 OCI 文档作为主题的介绍。
标签: java database oracle jdbc resultset