Cassandra bach查询一致性

时间:2017-03-20 08:55:18

标签: java cassandra datastax

我正在使用 Cassandra Java驱动程序

我有一个用例,我将数据批量插入到具有不同分区键的各种Cassandra表中。

    BatchStatement batch = new BatchStatement();
    batch.add (query1, query2, .....)
    session.executeAsync(batch);

考虑我的批处理语句中有20个查询,15个查询执行良好,5个查询失败。

我如何知道哪些查询失败以及执行了哪些查询。

由于性能方面的考虑,我使用的是executeAsync

<的 EDIT1:>

我们正在使用'未记录的批量查询'。

1 个答案:

答案 0 :(得分:2)

记录的多分区批次是原子的,但是以性能为代价。 从官方的Cassandra文档:

  

默认情况下,批次是原子的。在Cassandra批次的背景下   操作,原子意味着如果任何批次成功,则全部   将

所以任何查询都会成功或没有人。

未记录的多分区批次不是原子的。最好运行每个查询异步,然后单独收集结果,或者通过相同的分区密钥收集它们并在已记录的批处理中运行它们。

例如:

    List<String> queries = new ArrayList<>();

    List<ResultSetFuture> results = queries.stream()
            .map(query -> session.executeAsync(query))
            .collect(Collectors.toList());

    results.stream()
            .map(result -> {
                try {
                    return Optional.ofNullable(result.getUninterruptibly());
                } catch (Exception ex) {
                    // do smth
                    return Optional.empty();
                }
            })
            .forEach(//do Something);

同时启用java客户端连接池,因此每个查询都没有新的连接建立http://docs.datastax.com/en/developer/java-driver/2.1/manual/pooling/