我是apache-cassandra的新手,我打算将它作为新项目的数据存储库用于其写入性能 . 我已经设置了一个带有三个节点和复制因子3的cassandra集群 . 我的程序A使用datastax的cassandra-driver-core 2.1.7来编写和读取来自cassandra的数据 . 每次执行程序都会使用批处理语句将大约50条记录写入cassandra . 单次执行的测试显示完全没有问题 . 但是,当我开始以更密集的方式运行A时,会出现问题 .

详细信息如下:其他程序B在10秒内调用A 40次,因此在B完成执行后cassandra中应该有2k条记录 . 但是,写入cassandra的记录数量仅为2k记录中的25-30%(在B的每次运行中随机变化) . 顺便说一句,我使用cqlsh来检查写入的记录数 . 我需要多次重新运行B,以便最终所有2k记录都可以写入cassandra .

我现在完全没有线索,A和B的执行都没有报告错误,而且从日志中,A确实被执行了40次 .

我不知道这是否与集群设置,一致性级别设置等有关,或者是否需要进行任何调整以处理更高频率的写入 .

代码类似于:

String query = "insert into A (a,b,c,d,e,f) values (?,?,?,?,?,?)";
PreparedStatement p = session.prepare(query);
BatchStatement b = new BatchStatement();
for (int i=0; i<50; i++) {
  BoundStatement b1 = p.bind();
  b1.setInt("a",A);
  ...
  b1.setInt("f",F);
  b.add(b1);
}
session.execute(b);

任何帮助将不胜感激!

加成:

我更改了我的代码,不使用批处理语句作为@aaron和其他人建议 . 问题仍然存在,并非所有记录都写入cassandra(我的意思是我无法使用cqlsh的select语句看到它们) . 过了一会儿,我注意到问题只发生在以前插入的记录中(在使用delete cqlsh语句再次插入之前删除) . 如果以前从未插入过记录,则使用cqlsh的“select * from”显示正确的结果 . 任何人都可以告诉我为什么会这样,如果有办法避免这种情况发生?非常感谢 .