【问题标题】:Cassandra Datastax Driver - Connection PoolCassandra Datastax 驱动程序 - 连接池
【发布时间】:2013-12-23 16:16:39
【问题描述】:

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

我有 1.0 版的文档。它说:

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

他们对连接的理解是什么?当连接到一个集群时,我们有:一个Builder、一个Cluster和一个Session。其中哪一个是连接?

比如有这个参数:

maxSimultaneousRequestsPerConnection - 所有连接上的同时请求数 到创建更多连接的主机。

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

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

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

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

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

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

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

那么,连接其实就是Session?如果是这种情况,我应该保持集群静态,而不是生成器。

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

【问题讨论】:

    标签: java cassandra datastax-java-driver


    【解决方案1】:

    accepted answer (在撰写本文时) 给出了正确的建议:

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

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

    构建器≠集群≠会话≠连接≠语句

    Cluster.Builder 用于配置和创建一个集群

    Cluster 代表整个 Cassandra 环

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

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

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

    会话可能需要与环中的所有节点进行通信,这不能通过单个 TCP 连接完成,除非环中恰好包含一 (1) 个节点。 Session 管理一个connection pool,该池通常为环中的每个节点 至少有一个连接。 这就是为什么您应该尽可能地重复使用 Session 对象。应用程序不直接管理或访问连接。

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

    Statement会话中执行

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

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

    【讨论】:

    • 谢谢,我更新了我的答案(目前被接受的答案),以至少反映你的写作:-)
    【解决方案2】:

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

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

    编辑(2017 年 4 月 10 日):我在@William Price 之后精确地回答了这个问题。 请注意,这个答案已有 4 年历史,而 Cassandra 在此期间发生了相当大的变化!

    【讨论】:

    • 感谢您的回答。那么,池化逻辑是否保留在 Session 中,处于查询执行级别?我本来希望它在会话创建级别保存在 Cluster 对象中。
    • 池化策略通过构建器传递,并由 Session 对象用于选择要查询的节点。
    • 我只是希望当多个客户端同时使用同一个Session时,他们实际上会使用不同的物理连接。
    • @C4stor as @Anakin001 说 I'm just hoping that when multiple clients will use the same Session at the same time, they will actually use different physical connections. 这是真的
    • @PrakashPandey - 实际上,没有。在 C* 本机协议 v2 和 v3 中,物理 TCP 连接是多路复用的。在这些协议中,一个单个 TCP 连接可以分别支持多达 128 个和 32k+ 个同时 in-flight 异步请求。
    【解决方案3】:

    只是社区的更新。您可以通过以下方式设置连接池

    private static Cluster cluster;
    
    cluster.getConfiguration().getPoolingOptions().setMaxConnectionsPerHost(HostDistance.LOCAL,100);
    

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 2023-03-21
      • 2021-02-09
      • 2016-02-27
      • 2017-01-20
      • 2017-12-23
      • 1970-01-01
      • 2015-08-16
      • 2016-02-18
      相关资源
      最近更新 更多