Java Cassandra bach查询一致性
我正在使用Cassandra Java驱动程序 我有一个用例,在这个用例中,我将数据批量插入到具有不同分区键的各种Cassandra表中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个查询失败 我如何知道哪些查询失败,哪些被执行。 出于性能考
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批处理