我使用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);
谢谢!
答案 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命令检查)。