使用Datastax Cassandra本机Java客户端管理不同一致性级别的最佳实践

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

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

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

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

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

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

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

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

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

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

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

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