gpt4 book ai didi

java - 在 cassandra 中设置 TTL 后无法运行选择查询

转载 作者:行者123 更新时间:2023-12-01 09:30:02 25 4
gpt4 key购买 nike

我在 cassandra DB 中已有记录,使用 Java 类检索每一行,使用 TTL 更新并将它们存储回 Cassandra DB。之后如果我运行 select查询其执行和显示记录。但是当 TTL 时间完成后,如果我运行 select查询它必须显示零记录但它没有运行 select查询显示Cassandra Failure during read query at consistency ONE错误。对于其他表select查询工作正常,但该表(我应用了 TTL 的行)不起作用。

最佳答案

您正在使用常见的反模式。

1) 您正在使用批处理将数据分别加载到两个表中。我不知道您是否已经拥有一个集群,或者您在本地计算机上,但这不是将数据加载到 C* 集群的方式,而且您将会承受很大压力您的 C* 集群。仅当需要保持两个或多个表同步,而不是一次加载一堆记录时,才应使用批处理。我建议您阅读以下有关该主题的读物:

2) 您正在使用同步写入将漂亮的独立记录插入到集群中。您应该使用异步写入来加快数据处理速度。

3) 您在表中使用了 TTL 功能,这本身并没有那么糟糕。但是,过期 TTL 一个墓碑,这意味着当您SELECT时,您的查询 C* 将必须读取所有这些墓碑。

4)多次绑定(bind)准备好的语句:

BoundStatement bound = phonePrepared.bind(macAddress, ...

这应该是

BoundStatement bound = new BoundStatement(phonePrepared).bind(macAddress, ...

为了使用不同绑定(bind)语句。这不是反模式,这是您的代码的问题。

现在,如果您多次运行程序,由于 TTL 功能,您的表会有很多逻辑删除,这意味着 C* 正在努力读取所有这些内容,以便找到您“最后一次”编写的内容您成功运行了,但是花费的时间太长以至于查询超时。

只是为了好玩,您可以尝试在 SELECT 中增加超时,例如 2 分钟,然后喝杯咖啡,同时 C* 会得到您的返回记录。

我不知道你想实现什么目标,但快速的 TTL 是你的敌人。如果您只是想刷新您的记录,请尝试将 TTL 时间保持足够高,以免影响您的表现。或者,一个可能更好的解决方案是添加一个新列EXPIRED,仅当您需要删除记录时才“手动”写入。这取决于您的要求。

关于java - 在 cassandra 中设置 TTL 后无法运行选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39510757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com