Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Cassandra bach查询一致性_Java_Cassandra_Datastax - Fatal编程技术网

Java Cassandra bach查询一致性

Java Cassandra bach查询一致性,java,cassandra,datastax,Java,Cassandra,Datastax,我正在使用Cassandra Java驱动程序 我有一个用例,在这个用例中,我将数据批量插入到具有不同分区键的各种Cassandra表中 BatchStatement batch = new BatchStatement(); batch.add (query1, query2, .....) session.executeAsync(batch); 假设我的batch语句中有20个查询,15个查询执行良好,5个查询失败 我如何知道哪些查询失败,哪些被执行。 出于性能考

我正在使用Cassandra Java驱动程序

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

    BatchStatement batch = new BatchStatement();
    batch.add (query1, query2, .....)
    session.executeAsync(batch);
假设我的batch语句中有20个查询,15个查询执行良好,5个查询失败

我如何知道哪些查询失败,哪些被执行。

出于性能考虑,我使用了
executeAsync


我们使用的是“unlogged batch query”。

记录的多分区批处理是原子的,但以性能为代价。 来自卡桑德拉官方文件:

默认情况下,批处理是原子的。在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);
List querys=new ArrayList();
List results=querys.stream()
.map(查询->会话.executeAsync(查询))
.collect(Collectors.toList());
结果.流()
.map(结果->{
试一试{
返回可选的.ofNullable(result.getUnterruptibly());
}捕获(例外情况除外){
//做smth
返回可选的.empty();
}
})
.forEach(//做某事);

还要打开java客户端连接池,这样就不会在每个查询上建立新的连接,记录的多分区批处理是原子的,但会以性能为代价。 来自卡桑德拉官方文件:

默认情况下,批处理是原子的。在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);
List querys=new ArrayList();
List results=querys.stream()
.map(查询->会话.executeAsync(查询))
.collect(Collectors.toList());
结果.流()
.map(结果->{
试一试{
返回可选的.ofNullable(result.getUnterruptibly());
}捕获(例外情况除外){
//做smth
返回可选的.empty();
}
})
.forEach(//做某事);

还要打开java客户机连接池,这样在每个查询上就不会建立新的连接

请始终保持小批量。始终保持小批量。我认为批处理是原子的,如果它们是“一个分区”,但在我的用例中,Bach查询包含属于不同分区的查询so,这是对batch语句的一种常见滥用-look Logged batch在多个分区键中是原子的,但这很昂贵。我们使用的是
Unlocked batch
我认为如果批次为“一个分区”键,则它们是原子的,但在我的用例中,Bach查询包含属于不同分区的查询因此,这是对批处理语句的一种常见误用-在多个分区键中,look Logged批处理是原子的,但这很昂贵。我们使用的是
Unlogged批处理