【问题标题】:Not able to run select query after setting TTL in cassandra在 cassandra 中设置 TTL 后无法运行选择查询
【发布时间】:2017-01-23 11:01:09
【问题描述】:

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

【问题讨论】:

  • 请发布您的表架构和查询。
  • 我正在使用 Java 来获取记录和修改。我已经用表格和 Java 代码编辑了帖子...

标签: java jdbc cassandra datastax cassandra-2.0


【解决方案1】:

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

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

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

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

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

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

应该是这样的

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

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

现在,如果您多次运行程序,由于 TTL 特性,您的表会有很多墓碑,这意味着 C* 正在努力阅读所有这些内容,以便找到您“最后一次”写的内容您成功运行,并且查询超时需要很长时间。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2016-12-09
    • 2016-05-18
    • 2017-03-12
    • 2015-05-22
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多