【问题标题】:Is there any timeout period for PagingState in Cassandra?Cassandra 中的 PagingState 是否有任何超时期限?
【发布时间】:2017-04-12 13:37:02
【问题描述】:

我在 Java 中使用 Cassandra 有一段时间了,发现我们可以限制结果集的大小,并且通过从应用程序端存储分页状态,我们可以在同一条语句中重用该页面状态以从最后一个语句中获取数据以前的反应记录。例如,

ResultSet resultSet = session.execute("your query");
PagingState pagingState = resultSet.getExecutionInfo().getPagingState();

我们可以使用这个 pagingState 变量来获取下一批记录(基于设置的获取大小),如下所示。

Statement st = new SimpleStatement("your query");
st.setPagingState(pagingState);
ResultSet rs = session.execute(st);

这意味着 Cassandra 使用分页状态存储指向其索引数据的链接。我想了解是否存在任何超时时间,直到页面状态保留在 cassandra 数据库中,或者它使链接(分页状态)保持活动状态直到会话关闭。我翻遍了 Cassandra 的官方文档,还是找不到。

【问题讨论】:

    标签: java cassandra pagination


    【解决方案1】:

    幸运的是,没有与分页状态相关的超时,有一个小警告。由于版本之间可能会发生变化,因此无需过多详细说明,内部分页状态包含查询文本的 MD5、页面大小、使用的协议版本以及对表示最后读取行的集群键的引用(如果查询跨越分区,还有分区键)。

    但是,不保证分页状态可以跨协议版本工作,如java driver manual for paging 中所述:

    由于内部实现细节,PagingState 实例不能跨原生协议版本移植。在以下情况下,这可能会成为问题:

    • 您使用的是驱动程序 2.0.x 和 Cassandra 2.0.x,因此使用的是原生协议 v2;
    • 用户将包含序列化分页状态的 Web 服务链接添加为书签;
    • 您升级服务器堆栈以使用驱动程序 2.1.x 和 Cassandra 2.1.x,因此您现在使用的是协议 v3;
    • 用户尝试重新加载他们的书签,但分页状态是使用协议 v2 序列化的,因此尝试重用它会失败。

    【讨论】:

    • 感谢您的回复。那么,如果会话没有关闭,分页状态信息会永远保留在数据库中吗?
    • 所有状态都在 PagingState 数据本身中。 Cassandra 不保留任何分页状态,因此可以关闭 Session 并且 PagingState 仍将保持不变。这就是为什么它可以永远重复使用(使用相同的协议版本),以及为什么当您查询以前从未见过该查询的 C* 节点时,它仍然能够知道从哪里分页。 IE。如果您查询节点 A 并且它返回一个分页状态,如果您随后将查询发送到具有该分页状态的节点 B,它仍然可以工作,因为所有状态都包含在分页状态中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多