java - Cassandra .setFetchSize() on 语句不被接受

标签 java cassandra datastax-java-driver

我想在UI上实现分页,所以我这样设置fetchSize:

boundStatement.setFetchSize(20)

但是 setFetchSize() 不被接受。我的表现在有 400 行,并且检索了所有 400 行。当我使用

检索下一组行时
rs.getExecutionInfo().getPagingState();

然后检索接下来的 380 行。因此分页状态已正确设置和检索,但为什么驱动程序要从表中检索所有 400 行,我该如何避免这种情况或使其仅检索 400

部分代码:

....
....

// "SELECT * FROM abc.sometable"
BoundStatement boundStatement = pStmt.bind();
boundStatement.setFetchSize(20);

if (pagingState != null) {
  boundStatement.setPagingState(PagingState.fromString(pagingState));
}
ResultSet rs = session.execute(boundStatement);
PagingState nextPage = rs.getExecutionInfo().getPagingState();
int remaining = rs.getAvailableWithoutFetching();
List<?> list = new ArrayList<>();
for (Row row : rs) {
  list.add(getValidObjectFromRow(row));
}
 ....

Cassandra 版本 - 3.7 和 cassandra 驱动程序版本 - 3.1.0

谢谢!

最佳答案

setFetchSize 控制页面大小,但它不控制 ResultSet 中返回的最大行数。

for (Row row : rs) {
    list.add(getValidObjectFromRow(row));
}

在您的示例代码的上述代码中,它将遍历前 20 行,当它到达当前结果的末尾时,它将获取更多行,直到没有更多行匹配查询。

如果您想限制返回的行数,您有几个选择。

  1. LIMIT X(其中 x 是您想要的行数)添加到查询的末尾。
  2. 只迭代直到没有更多的行,即:
while(rs.getAvailableWithoutFetching() > 0) {
    list.add(getValidObjectFromRow(rs.one()));
}

这将从 ResultSet 中读取,直到页面中不再有行,此时它将停止迭代。

关于java - Cassandra .setFetchSize() on 语句不被接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40556899/

相关文章:

java - 为什么 Unicode u+202e 和 u+202c 会导致输出文本有不同的结果

hadoop - Cassandra 和 Couchbase 之间此用例的潜在权衡

java - 如何使用Spring Boot远程建立与Cassandra的连接?

spring-mvc - 在同一 jvm 中部署的多个 war 中使用 cassandra 驱动程序时出现 jmx 错误

java - 在 Java 中使用命令行编译和运行多个包

java - SDN4 - Neo4j OGM 和 JsonSubType 注释

java - 如何从 Mono<ClientResponse> 获取正文?

elasticsearch - Elastic,Kafka和Cassandra的3节点群集-在3台计算机上

cassandra - 如果发生读取超时,如何在 Cassandra 中重试

scala - 通过传递变量将 SET<String> 插入 cassandra