更新时间:2023-12-11 GMT+08:00

如何设置分页查询(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);
}

保存当前分页状态并复用

  1. 保存当前分页状态。
    PagingState pagingState = resultSet.getExecutionInfo().getPagingState();
    String string = pagingState.toString();
    byte[] bytes = pagingState.toBytes();
  2. 加载当前分页状态并进行复用。
    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