使用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是什么,它是一个”)。
- 由于Java LinkedList的所有成员变量都是瞬态的,因此实现Serializable会有什么用?
- java.lang.UnsupportedClassVersionError:.class文件中的错误版本号
- Cassandra批处理查询具有不同分区键的表的性能
- 如何解决“在类路径中发现Netty的本地epoll传输,但epoll不可用。 使用NIO代替“警告?
- Apache-Cassandra 0.8.2中的UnavailableException()
- 为什么Cassandra客户端在没有epoll的情况下失败?
- 防止Cassandra转储hprof文件
- 写入cassandra datastax驱动程序引发的超时
- 为何我无法连接到cassandra
- 只有日期范围扫描Cassandra CQL时间戳
- 线程“main”中的exceptionorg.apache.spark.SparkException:此JVM中只能运行一个SparkContext(参见SPARK-2243)