CQL 中的 PagingState for 语句

Pra*_*nth 1 java cql cassandra nosql datastax

我试图了解PagingState如何与 Cassandra 中的 Statement 配合使用。我尝试使用一个示例,将几千条记录插入到数据库中,并尝试从数据库中读取相同的记录,并将获取大小设置为 10 并使用分页状态。这工作得很好。这是我的示例 junit 代码:

\n\n
@Before\npublic void setup() {\n    cassandraTemplate.executeQuery("create table if not exists pagesample(a int, b int, c int, primary key(a,b))");\n    String insertQuery = "insert into pagesample(a,b,c) values(?,?,?)";\n    PreparedStatement insertStmt = cassandraTemplate.getConnection().prepareStatement(insertQuery);\n    for(int i=0; i < 5; i++){\n        for(int j=100; j<1000; j++){\n            cassandraTemplate.executeQuery(insertStmt, new Object[]{i, j, RandomUtils.nextInt()});\n        }\n    }\n}\n\n@Test\npublic void testPagination() {\n    String selectQuery = "select * from pagesample where a=?";\n    String pagingStateStr = null;\n    for(int run=0; run<90; run++){\n        ResultSet resultSet = selectRows(selectQuery, 10, pagingStateStr, 1);\n        int fetchedCount = resultSet.getAvailableWithoutFetching();\n        System.out.println(run+". Fetched size: "+fetchedCount);\n        for(Row row : resultSet){\n            System.out.print(row.getInt("b")+", ");\n            if(--fetchedCount == 0){\n                break;\n            }\n        }\n        System.out.println();\n\n        PagingState pagingState = resultSet.getExecutionInfo().getPagingState();\n        pagingStateStr =  pagingState.toString();\n    }\n}\n\npublic ResultSet selectRows(String cql, int fetchSize, String pagingState, Object... bindings){\n    SimpleStatement simpleStatement = new SimpleStatement(cql, bindings);\n    statement.setFetchSize(fetchSize);\n    if(StringUtils.isNotEmpty(pagingState)){\n        statement.setPagingState(PagingState.fromString(pagingState));\n    }\n    return getSession().execute(simpleStatement);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我执行这个程序时,我发现 testPagination 中的每次迭代都恰好打印 10 条记录。但文档是这样说的:

\n\n
    \n
  • 请注意,设置提取大小并不意味着 Cassandra 将返回准确的行数,它可能会返回稍微多一点或少一点的结果。
  • \n
\n\n

我真的无法理解为什么 Cassandra 将返回与获取大小中指定的行数不完全相同的行数。查询中没有提供where子句时是否会出现这种情况?当查询受分区键约束时,它会返回准确的记录数吗?请澄清。

\n

Oli*_*lat 5

来自CQL协议规范

客户也不应该断言没有结果会带来更多result_page_size结果。虽然当前的实现始终尊重 的确切值result_page_size但出于性能原因,我们保留将来返回稍小或稍大页面的权利

因此,最好始终依赖getAvailableWithoutFetching页面大小而不是页面大小,以防 Cassandra 将来更改其实现。