如何设置分页查询(Java)
指定每次查询获取的行数
在创建集群连接时,可以指定每次查询获取的行数,具体为下列setFetchSize内参数。
Cluster cluster = Cluster.builder() .addContactPoint(contactPoint) .withPort(8636) .withQueryOptions(new QueryOptions().setFetchSize(20)) .build();
设置成功后,在该配置下产生的会话,都会一次只获取设置的行数,在缓存(20行)耗尽会触发向服务端拉取数据的请求,并且等待返回,会有相应的等待时间延迟。
提前获取下一页
如果需要手动提前获取更多行存入当前结果集避免等待,可以参考以下代码,在结果集剩余10行时,先提交并行从服务器拉取更多行的请求。
ResultSet rs = session.execute("select * from space3.table3;"); for (Row row : rs) { if (rs.getAvailableWithoutFetching() == 10 && !rs.isFullyFetched()){ System.out.println("pre-fetch more rows. "); rs.fetchMoreResults(); } System.out.println(row); }
保存当前分页状态并复用
- 保存当前分页状态。
PagingState pagingState = resultSet.getExecutionInfo().getPagingState(); String string = pagingState.toString(); byte[] bytes = pagingState.toBytes();
- 加载当前分页状态并进行复用。
PagingState pagingState = PagingState.fromString(string); Statement st = new SimpleStatement("your query"); st.setPagingState(pagingState); ResultSet rs = session.execute(st);
注:分页情况只可以获取、储存和复用,不支持修改并应用在新的其他查询语句上。
Cassandra并不支持offset查询,即无法跳过结果集的一部分,直接获取指定index范围的结果。如果需要对应功能,需要在业务中进行封装模拟,但该查询仍然是顺序查询,客户可以丢弃无效结果。更多高级用法与介绍可以参考DataSax Java驱动程序3.11。