Cassandra Datastax Driver - Connection Pool生成器 ≠ 群集≠会话≠连接≠语句

2022-09-04 07:23:51

我正在尝试了解Datastax Cassandra驱动程序中的连接池,以便我可以在我的Web服务中更好地使用它。

我有1.0版的文档。它说:

Java 驱动程序异步使用连接,因此可以同时在同一连接上提交多个请求。

他们通过连接理解什么?连接到集群时,我们有:构建器,集群和会话。哪一个是连接?

例如,有以下参数:

maxSimultaneousRequestPerConnection - 对主机的所有连接上的同时请求数,之后将创建更多连接。

因此,在连接池的情况下,这些连接是自动创建的(这是我所期望的)。但究竟是什么联系呢?群集对象?会话?

我正在尝试决定在我的Web服务中保持“静态”的内容。目前,我决定保持生成器不变,因此对于每次调用,我都会创建一个新集群和一个新会话。这样可以吗?如果群集是连接,则应该没问题。但事实果真如此吗?现在,记录器说,对于每个呼叫:

2013:12:06 12:05:50 DEBUG 群集:742 - 使用接触点启动新群集

2013:12:06 12:05:50 DEBUG 控制连接:216 - [控制连接] 刷新节点列表和令牌映射

2013:12:06 12:05:50 DEBUG 控制连接:219 - [控制连接] 刷新架构

2013:12:06 12:05:50 调试控制连接:147 - [控制连接] 成功连接到...

那么,它每次都连接到集群吗?这不是我想要的,我想重用连接。

那么,连接实际上是会话?如果是这种情况,我应该保持集群不变,而不是生成器。

我应该调用什么方法,以确保我尽可能重用连接?


答案 1

接受的答案(在撰写本文时)给出了正确的建议:

只要您使用相同的 Session 对象,[将]重用连接。

但是,某些部分最初过于简化。我希望以下内容能深入了解每种对象类型的范围及其各自的用途。

生成器 ≠ 群集≠会话≠连接≠语句

Cluster.Builder 用于配置和创建 Cluster

一个代表整个卡桑德拉环

环由多个节点(主机)组成,环可以支持一个或多个密钥空间。您可以查询有关集群(环)级属性的 Cluster 对象。

我还将其视为表示环的调用应用程序的对象。您向构建器传达了应用程序的需求(例如加密、压缩等),但正是此对象首先实现/与实际的 C* 环进行通信。如果应用程序对不同的用户/目的使用多个身份验证凭据,则即使它们连接到同一个环,也可能有不同的 Cluster 对象。

会话本身不是连接,但它管理它们

会话可能需要与环中的所有节点通信,这不能通过单个 TCP 连接完成,除非在环只包含一(1)个节点的特殊情况下。会话管理一个连接池,该池通常为环中的每个节点至少具有一个连接。这就是您应该尽可能多地重用 Session 对象的原因。应用程序不直接管理或访问连接。

会话是从群集对象访问的;它通常一次“绑定”到单个键空间,该键空间成为从该会话执行的语句的默认键空间。语句可以使用完全限定的表名(例如 )来访问其他键空间中的表,因此不需要使用多个会话来跨键空间访问数据。使用多个会话同一环通信会增加所需的 TCP 连接总数。keyspacename.tablename

语句会话中执行

语句可以准备,也可以不准备,每个语句要么改变数据,要么查询数据(在某些情况下,两者兼而有之)。最快、最有效的语句最多需要与一个节点通信,并且来自拓扑感知群集会话应仅在单个 TCP 连接上联系该节点(或其对等节点之一)。效率最低的语句必须触及所有副本(大多数节点),但这将由环本身的协调器节点处理,因此即使对于这些语句,Session 也将仅使用来自应用程序的单个连接。

此外,驱动程序使用的 Cassandra 二进制协议的版本 2 和 3 在连接上使用多路复用。因此,虽然单个语句至少需要一个 TCP 连接,但该单个连接可以同时为多达 128 或 32k+ 个异步请求提供服务,具体取决于协议版本(分别)。


答案 2

你是对的,连接实际上在会话中,会话是你应该给你的DAO写入Cassandra的对象。

只要使用相同的 Session 对象,就应该重用连接(您可以将会话视为连接池)。

编辑(2017/4/10):我@William价格一之后精确地给出了这个答案。请注意,这个答案是4年前的,卡桑德拉在此期间已经改变了一点!


推荐