使用datastax java驱动程序2.1.7将数据高频插入cassandra时丢失

使用datastax java驱动程序2.1.7将数据高频插入cassandra时丢失,java,cassandra-2.0,datastax-java-driver,Java,Cassandra 2.0,Datastax Java Driver,我是apache cassandra的新手,我计划将其用作一个新项目的数据存储库,以提高其写入性能。我已经设置了一个cassandra集群,它有三个节点和复制因子3。我的程序A使用datastax的cassandra驱动程序core 2.1.7从cassandra写入和读取数据。程序的每次执行都使用batch语句将大约50条记录写入cassandra。对单个执行的测试显示根本没有问题。然而,当我开始以更密集的方式运行时,问题就出现了 详情如下: 另一个程序B在10秒内调用A 40次,因此在B完成

我是apache cassandra的新手,我计划将其用作一个新项目的数据存储库,以提高其写入性能。我已经设置了一个cassandra集群,它有三个节点和复制因子3。我的程序A使用datastax的cassandra驱动程序core 2.1.7从cassandra写入和读取数据。程序的每次执行都使用batch语句将大约50条记录写入cassandra。对单个执行的测试显示根本没有问题。然而,当我开始以更密集的方式运行时,问题就出现了

详情如下: 另一个程序B在10秒内调用A 40次,因此在B完成执行后,cassandra中应该有2k条记录。然而,在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);
String query=“插入A(A,b,c,d,e,f)值(?,,,,,,,,?)”;
PreparedStatement p=会话准备(查询);
BatchStatement b=新的BatchStatement();

对于(int i=0;我可以详细说明如何执行语句吗?(一段代码片段可能会很有帮助)我想到的一件事是,如果您使用异步API并且从不检查返回的未来,您可能会有请求以静默方式失败。@OlivierMichallat我正在使用session.execute()。我想它是同步的?我将用代码更新我的帖子批处理语句的最佳用途是将UPSERT以原子方式推送到多个表中。它实际上并不意味着要向同一个表发送50个更新。看看你的代码在不使用批处理语句的情况下是如何工作的。@BryceAtNetwork23非常感谢!我将尝试一下Cassandra最适合写通hput,对于仅2k条记录,您确实不需要对其进行批处理,并且确保此场景不适合批处理查询。相反,您让程序B在多个线程中调用A,并将一致性降低为一个。为了安全起见,您可以在程序完成后在节点上运行读取修复(尽管不是强制性的)