【发布时间】:2015-10-15 05:23:43
【问题描述】:
我有一个由 3 个 Cassandra 2.0 节点组成的集群。我的应用程序我编写了一个测试,它试图向 Cassandra 写入和读取一些数据。一般来说,这工作正常。
好奇的是,在我重新启动计算机后,此测试将失败,因为在写入后我读取了我之前写入的相同值,我得到的是 null 而不是值,但写入时也不例外。 如果我手动截断使用的列族,测试将通过。之后我可以按照我想要的频率执行这个测试,它一次又一次地通过。此外,Cassandra 中是否存在值并不重要。结果总是一样的。
如果我查看 CLI 和 CQL-shell,会发现两种不同的视图:
有人知道出了什么问题吗? CLI中的时间戳是在重新执行后更新的,所以看起来是读取问题?
我的代码的一部分: 对于我尝试过的插入
Insert.Options insert = QueryBuilder.insertInto(KEYSPACE_NAME,TABLENAME)
.value(ID, id)
.value(JAHR, zonedDateTime.getYear())
.value(MONAT, zonedDateTime.getMonthValue())
.value(ZEITPUNKT, date)
.value(WERT, entry.getValue())
.using(timestamp(System.nanoTime() / 1000));
和
Insert insert = QueryBuilder.insertInto(KEYSPACE_NAME,TABLENAME)
.value(ID, id)
.value(JAHR, zonedDateTime.getYear())
.value(MONAT, zonedDateTime.getMonthValue())
.value(ZEITPUNKT, date)
.value(WERT, entry.getValue());
我的选择看起来像
Select.Where select = QueryBuilder.select(WERT)
.from(KEYSPACE_NAME,TABLENAME)
.where(eq(ID, id))
.and(eq(JAHR, zonedDateTime.getYear()))
.and(eq(MONAT, zonedDateTime.getMonthValue()))
.and(eq(ZEITPUNKT, Date.from(instant)));
Consistencylevel 是 QUORUM(两者都适用)和 replicationfactor 3
【问题讨论】:
-
您能发布您的应用程序端查询和 INSERT 代码吗?
-
您使用什么一致性级别进行读取和写入?您的键空间上的复制因子是多少?
-
这通常发生在使用默认的 ONE 一致性级别而不是 QUORUM。除非明确设置,否则 cqlsh shell 使用 ONE。如果您等待一两秒钟或再试一次,您会得到正确的值吗?
-
你说一致性级别是 QUORUM 但我没有看到它设置在查询生成器构建的查询上?
-
在执行每条语句之前我会做
statement = statement.setConsistencyLevel(ConsistencyLevel.QUORUM);但即使我等了一个小时,测试也会失败。在截断列族之后,测试通过了。
标签: cassandra cql cassandra-2.0 datastax-java-driver cassandra-cli