【问题标题】:Cassandra .setFetchSize() on statement is not honoured声明中的 Cassandra .setFetchSize() 不受尊重
【发布时间】:2016-11-12 07:49:30
【问题描述】:

我想在 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

谢谢!

【问题讨论】:

  • 您是如何使用 ResultSet 的?驱动程序可能会在幕后分页接下来的 20 行(等等)。
  • 如果你使用wireshark,你可以查看查询/结果,看看它是否实际获取了20个块。如果需要更多控制,您可能只想将LIMIT 20 添加到您的查询和手动页面
  • 用代码块更新问题。
  • 你用的是什么版本的cassandra?
  • 我正在使用 Cassandra 版本 - 3.7 和 cassandra 驱动程序版本 - 3.1.0

标签: java cassandra datastax-java-driver


【解决方案1】:

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驱动文档,你的回复给了他们新的意义!大声笑:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2015-12-26
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多