Cassandra Java驱动程序返回已删除的列

nwlqm0z1  于 2022-09-27  发布在  Cassandra
关注(0)|答案(3)|浏览(181)

我使用Datastax Cassandra Java Driver 2.1.0删除数据库中的一组行。我的测试环境基于Cassandra 2.0.7的单个节点。我运行delete语句,然后运行查询检查结果,以选择删除的行。问题是,第二个查询返回行,但如果我通过cqlsh进行检查,这些行确实会被删除。
查询跟踪报告这些行被标记为逻辑删除,那么为什么选择查询仍要检索数据?以下是删除任务的代码:

Statement query = QueryBuilder.delete().from(QueryBuilder.quote(CF_MESSAGES))
    .where(QueryBuilder.in(CF_MESSAGES_KEY, (Object[]) rowKeyArray));       
session.execute(query);

这里是选择代码:

query = QueryBuilder.select().all().from(QueryBuilder.quote(CF_MESSAGES))
    .where(QueryBuilder.in(CF_MESSAGES_KEY, (Object[]) rowKeyArray))
    .and(QueryBuilder.lte(CF_MESSAGES_COLUMN1, "2:" + Character.MAX_VALUE));
ResultSet queryResult = session.execute(query);

非常感谢。

hof1towb

hof1towb1#

修复是一种反熵机制,应该每周运行一次,或者至少比gc_grace_seconds更频繁,以避免僵尸墓碑再次出现。DataStax OpsCenter有一个自动执行此任务的Repair Service
您可以手动运行:

nodetool repair

在一个节点中或

nodetool repair -pr

在每个节点中。-pr选项将确保只修复节点的主范围。

dwbf0jvd

dwbf0jvd2#

你应该试试nodetool repair…我也有同样的问题:Cassandra and defuncting connection(见注解)

wlp8pajw

wlp8pajw3#

如果您的环境是测试环境,请尝试减少gc_grace_seconds,并检查发生删除时是否有任何节点关闭(可以使用Linux uptime命令检查)。

相关问题