4

使用 CQL3,Cassandra 一致性级别现在设置在会话级别。本机 Java 客户端的 Datastax 文档指出:

会话实例是线程安全的,通常每个应用程序只需要一个实例

但我很难看到单个 Session 实例如何处理多个一致性级别(例如使用 QUORUM 写入并使用 ONE 读取)。我到处都看到了潜在的比赛条件。

一个明显的解决方案是为读取和写入创建单独的会话,每个会话都设置了适当的一致性级别。但这并不能完全解决问题。如果一个班级修改了两个会话之一的一致性级别怎么办?然后,会话实例的所有后续用户将在不知不觉中使用新的 CL。

因此,据我所知,最安全的选择是每次需要访问 Cassandra 时创建一个新的 Session 实例,并在创建时明确设置 CL。

我不清楚的是这种方法是否会导致性能损失。例如,是否会session = cluster.connect()session.execute("CONSISTENCY [cl]")涉及到服务器的旅行?

我在这里错过了什么吗?有没有人有相关经验可以分享?谢谢。

更新:我看到com.datastax.driver.core.Query有一种设置一致性级别的方法。因此,也许最简单的选择是坚持使用单个 Session 实例并为每个查询设置 CL。

4

1 回答 1

7

因此,也许最简单的选择是坚持使用单个 Session 实例并为每个查询设置 CL。

这不仅是最简单的选项,而且是选项

在驱动程序的 1.0.2 版本中,无法在每个查询的其他任何地方设置一致性级别。没有每个会话 CL。从Java驱动2.0版本开始,可以通过Cluster.Builder.withQueryOptions()方法为Cluster设置全局默认一致性级别。

不过,就其价值而言,我个人认为 CL 是每个查询的重要参数。所以我不会觉得为每个查询设置它是疯狂的,即使它为了文档的缘故保留默认值 ONE(即说“我确实知道这个查询的相关 CL 是什么,它是 ONE”)。

于 2013-08-21T13:47:36.437 回答