语句上的Cassandra .setFetchSize()不受尊重

时间:2016-11-11 22:00:46

标签: 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

谢谢!

1 个答案:

答案 0 :(得分:6)

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

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

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

如果要限制返回的行数,可以选择几个。

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

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