public ResultSet execute(Statement statement);
对这个方法的评论:
该方法会一直阻塞,直到从数据库中收到至少一些结果。但是,对于SELECT查询,它不能保证结果已经完全接收。但是,它确保已经从数据库中收到了一些响应,并且特别保证如果请求无效,此方法将抛出异常。
来自com.datastax.driver.core.Session的非阻塞执行方法
public ResultSetFuture executeAsync(Statement statement);
这种方法不会阻塞。一旦查询已经传递给底层网络堆栈,它就会返回。特别是,从此方法返回并不能保证查询有效或已提交到实时节点。任何与查询失败有关的异常都将在访问{@link ResultSetFuture}时抛出。
我有两个问题,希望您能帮助我理解。
假设我有100万条记录,我希望它们全部到达数据库(没有任何丢失)。
问题1:如果我有n个线程,所有线程将具有相同数量的记录,它们需要使用阻塞执行调用向Cassandra发送多个插入查询。如果我增加n的值,是否也可以加快我需要将所有记录插入到Cassandra的时间?
这会导致Cassandra的性能问题吗?Cassandra必须确保对于每个单独的插入记录,集群中的所有节点都应立即知道新记录吗?为了维护数据的一致性。(我假设Cassandra节点甚至不考虑使用本地机器时间来控制记录插入时间)。
问题2:使用非阻塞执行,我如何确保所有插入都成功?我所知道的唯一方法是等待ResultSetFuture检查插入查询的执行情况。我能做到更好吗?非阻塞执行失败的可能性比阻塞执行更高吗?
非常感谢您的帮助。