use*_*447 3 java cassandra datastax-java-driver
我想在UI上实现分页,所以我像这样设置fetchSize:
boundStatement.setFetchSize(20)
Run Code Online (Sandbox Code Playgroud)
但是setFetchSize()不受尊重.我的表目前有400行,检索到所有400行.当我使用时检索下一组行
rs.getExecutionInfo().getPagingState();
Run Code Online (Sandbox Code Playgroud)
然后检索接下来的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));
}
....
Run Code Online (Sandbox Code Playgroud)
Cassandra版本 - 3.7和cassandra驱动程序版本 - 3.1.0
谢谢!
setFetchSize控制页面大小,但它不控制a中返回的最大行数ResultSet.
for (Row row : rs) {
list.add(getValidObjectFromRow(row));
}
Run Code Online (Sandbox Code Playgroud)
在示例代码的上述代码中,它将遍历前20行,当它到达当前结果的末尾时,它将获取更多,直到没有更多行与查询匹配.
如果要限制返回的行数,可以使用几个选项.
LIMIT X在查询结尾添加(其中x是您想要的行数).while(rs.getAvailableWithoutFetching() > 0) {
list.add(getValidObjectFromRow(rs.one()));
}
Run Code Online (Sandbox Code Playgroud)
这将从ResultSet页面中没有更多行直到读取为止,此时它将停止迭代.