首页 文章

Cassandra bach查询一致性

提问于
浏览
0

我正在使用 Cassandra Java driver .

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

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

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

How can I know which queries failed and which got executed.

我正在使用 executeAsync ,因为从性能角度来看 .

< Edit1: >

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

1 回答

  • 2

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

    默认情况下,批次是原子的 . 在Cassandra批处理操作的上下文中,atomic表示如果任何批处理成功,则所有批处理都将成功 .

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

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

    例如:

    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客户端连接池,因此每个查询都没有新的连接 Build http://docs.datastax.com/en/developer/java-driver/2.1/manual/pooling/

相关问题