Cassandra Java Driver返回已删除的列

时间:2014-11-04 11:03:01

标签: cassandra-2.0 datastax-java-driver

我使用Datastax Cassandra Java Driver 2.1.0来删除数据库中的一组行。我的测试环境基于Cassandra 2.0.7的单个节点。 我运行delete语句,然后检查运行查询的结果以选择已删除的行。 问题是第二个查询返回行,但如果我通过cqlsh检查它,行确实被删除。

查询跟踪报告行被标记为逻辑删除,那么为什么select查询仍会检索数据? 以下是删除任务的代码:

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

这里是select的代码:

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);

谢谢!

3 个答案:

答案 0 :(得分:2)

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

手动,你可以运行:

nodetool repair

在一个节点或

nodetool repair -pr

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

答案 1 :(得分:0)

您应该尝试nodetool repair ...我遇到了同样的问题: Cassandra and defuncting connection(见评论)

答案 2 :(得分:0)

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