我正在使用 Cassandra Java驱动程序。
我有一个用例,我将数据批量插入到具有不同分区键的各种Cassandra表中。
BatchStatement batch = new BatchStatement();
batch.add (query1, query2, .....)
session.executeAsync(batch);
考虑我的批处理语句中有20个查询,15个查询执行良好,5个查询失败。
我如何知道哪些查询失败以及执行了哪些查询。
由于性能方面的考虑,我使用的是executeAsync
。
<的 EDIT1:>
我们正在使用'未记录的批量查询'。
答案 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/