我正在使用Datastax Cassandra java驱动程序记录实时交易数据。我已将Cassandra配置为单个节点,复制因子为1,一致性级别为ALL。
我经常写的不记录,但不会失败。 java客户端不会抛出任何错误,并且会调用异步执行成功回调。 Trace似乎没有显示任何异常:
[CassandraClient] - 在2015年12月22日星期一22:54:04添加到/10.0.0.118 [SharedPool-Worker-1]上可记忆的交易
[CassandraClient] - 在2015年12月22日星期一22:54:04附加到/10.0.0.118 [SharedPool-Worker-1]上的提交日志
[CassandraClient] - 协调员使用/10.0.0.118
但是,当我查看cassandra shell中的数据时,请注意跳过的ID(忽略错误的日期):
cqlsh:密钥空间>从交易中选择*,其中按日期排序限制10;
date | id | price | volume
--------------------------+--------+--------+------------
1970-01-17 19:00:19+0000 | 729286 | 435.96 | 3.4410000
1970-01-17 19:00:19+0000 | 729284 | 436.00 | 17.4000000
1970-01-17 19:00:19+0000 | 729283 | 436.00 | 0.1300000
1970-01-17 19:00:19+0000 | 729277 | 436.45 | 5.6972000
1970-01-17 19:00:19+0000 | 729276 | 436.44 | 1.0000000
1970-01-17 19:00:19+0000 | 729275 | 436.44 | 0.9728478
1970-01-17 19:00:19+0000 | 729274 | 436.43 | 0.0700070
1970-01-17 19:00:19+0000 | 729273 | 436.45 | 0.0369260
1970-01-17 19:00:19+0000 | 729272 | 436.43 | 1.0000000
1970-01-17 19:00:19+0000 | 729271 | 436.43 | 1.0000000
为什么有些插入会无声地失败?指示指向时间戳问题,但我没有检测到模式。
类似的问题:Cassandra - Write doesn't fail, but values aren't inserted
有关答案 0 :(得分:0)
写入成功并且缺少某些记录的事实是C * 覆盖缺失的行的症状。您可能会看到此类行为的原因是滥用绑定语句。
通常人们准备语句:
PreparedStatement ps = ...;
BoundStatement bs = ps.bind();
然后他们发出类似的话:
for (int i = 0; i < myHugeNumberOfRowsToInsert; i++) {
session.executeAsync(bs.bind(xx));
}
这实际上会产生奇怪的行为,因为绑定语句在大多数executeAsync
调用中是相同的,并且如果循环足够快以排队(比如说)6个查询在驱动程序触发第一个查询之前,所有提交的查询将共享相同的绑定数据。一个简单的解决方法是实际发出不同的 BoundStatement :
for (int i = 0; i < myHugeNumberOfRowsToInsert; i++) {
session.executeAsync(new BoundStatement(ps).bind(xx));
}
这将保证每个语句唯一,并且根本不可能覆盖。