在执行具有数十亿行的选择查询时,我有一个关于堆大小的问题。
我将jdbc与prepared statement
一起使用,获取大小为1000行。
下面的代码说明了我的问题:
ResultSet rs = ...
for (Row r : rs) {
// If the result is not fully fetched
if (rs.getAvailableWithoutFetching() == FETCH_SIZE && !rs.isFullyFetched()) {
LOGGER.info("Load " + FETCH_SIZE + " more rows");
rs.fetchMoreResults();
}
...
}
java是加载数十亿行还是通过FETCH_SIZE
行加载FETCH_SIZE
行?
假设您使用的是setFetchSize
:文档中的数据税驱动程序
提取大小控制将检索多少结果行同时(目标是避免在用于产生大结果的查询的存储器)。请注意可以使用低至1的值,强烈建议使用这在实践中是一个低值,因为它将产生非常差的性能。如果在毫无疑问,放弃违约可能是个好主意。
只有SELECT查询才会使用该设置。
注意:本机协议版本1不支持分页。如果使用fetchSize调用此方法>0和fetchSize=Integer.MAX_VALUE和协议版本正在使用中(即,如果您通过Cluster.Builder.withProtocolVersion(int)或强制执行版本1如果你使用Cassandra 1.2),你会得到为提交此语句时出现UnsupportedProtocolVersionException执行
因此,它不会将以前提取的结果保存在内存中,但您必须小心,不要在代码中引用这些结果,以免被垃圾收集。还要阅读fetchMoreResults的文档——它可能不会按照您预期的方式工作。