是否可以从指定或随机位置开始分页?
我为什么需要这个?
在我的生产节点上,我有几个并行服务作业,可以迭代大约200,000个项目并更新它们的信息。新版本的软件通常被推送到服务器,每次推送时,服务作业都会重新启动。所以所有工作都是从一开始就开始。当然我使用锁,但如果我可以指示那些并行作业从不同的页面开始,那会更好。
答案 0 :(得分:3)
如native protocol specification第8节所述,通过传递pagingState
,通过Apache Cassandra和客户端驱动程序完成分页:
但是,如果某些结果不是 作为第一个响应的一部分,将设置 Has_more_pages 标志和结果 将包含 paging_state 值。在这种情况下, paging_state 值 应该在QUERY或EXECUTE消息中使用(具有相同的查询) 原始的或行为是未定义的)来检索下一页 结果
当您查询数据时,可以访问并存储此分页状态,以便以后从您从先前位置开始作业时描述的方式进行存储。
这可以使用DataStax java-driver完成,如“Paging' 'Saving and Reusing the paging state'部分下的页面:
驱动程序公开一个PagingState对象,该对象表示在获取最后一页时我们在结果集中的位置:
ResultSet resultSet = session.execute("your query");
// iterate the result set...
PagingState pagingState = resultSet.getExecutionInfo().getPagingState();
此对象可以序列化为String或字节数组:
String string = pagingState.toString();
byte[] bytes = pagingState.toBytes();
此序列化表单可以保存在某种形式的持久存储中,以便以后重用。在我们的Web服务示例中,我们可能会将字符串版本作为查询参数保存到下一页(http://myservice.com/results?page=< ...>)的URL中。当稍后检索该值时,我们可以反序列化它并将其重新注入语句中:
PagingState pagingState = PagingState.fromString(string);
Statement st = new SimpleStatement("your query");
st.setPagingState(pagingState);
ResultSet rs = session.execute(st);
其他驱动程序应该采用类似的方式进行分页。