【问题标题】:Is a cassandra session thread safe? (using cpp driver)cassandra 会话线程安全吗? (使用 cpp 驱动程序)
【发布时间】:2015-01-13 10:26:47
【问题描述】:

我正在开发一个多线程应用程序并使用 Cassandra 作为后端。

之前,我为每个子线程创建了一个单独的会话,并在执行后终止线程之前关闭了会话。但后来我认为这可能是一项昂贵的工作,所以我现在将其设计为,我在服务器启动时打开了一个会话,并且任意数量的客户端都可以使用该会话进行查询。

问题:我只是想知道这是否正确,或者有更好的方法吗?我知道连接池是一种选择,但是在这种情况下真的需要吗?

【问题讨论】:

    标签: c++ multithreading cassandra client


    【解决方案1】:

    它在 Java 驱动程序中肯定是线程安全的,所以我假设 C++ 驱动程序是相同的。

    鼓励您只创建一个会话并让所有线程都使用它,以便驱动程序可以有效地维护与集群的连接池并异步处理来自客户端线程的命令。

    如果您在一台客户端计算机上创建多个会话或不断打开和关闭会话,您将强制驱动程序不断建立和断开与集群的连接,这会浪费资源。

    在为 Cassandra 使用 DataStax 驱动程序时引用 this Datastax blog post 的大约 4 条简单规则:

    1. 每个(物理)集群(每个应用程序)使用一个集群实例 终生)
    2. 每个键空间最多使用一个会话,或使用单个 会话并在查询中明确指定键空间
    3. 如果您多次执行语句,请考虑使用 PreparedStatement
    4. 您可以减少网络往返次数,还可以使用批处理进行原子操作

    【讨论】:

    • 所以你的意思是连接池是由驱动自己完成的?!
    • 没错。 Cassandra 是高度异步的,因此驱动程序可以使用到节点的单个连接来处理许多正在运行的事务。为了实现负载平衡,驱动程序会打开到多个 Cassandra 节点的持久连接,并且它可以有效地管理和使用连接池。
    【解决方案2】:

    C/C++ 驱动程序在会话和未来级别绝对是线程安全的。

    CassSession 对象用于查询执行。在内部,会话对象还管理与 Cassandra 的客户端连接池,并使用负载平衡策略在这些连接之间分配请求。应用程序应为每个键空间创建一个会话对象,因为会话对象设计为在应用程序内创建一次、重用和由多个线程共享

    他们实际上有一个名为线程安全的部分:

    CassSession 被设计为可从多个线程同时使用。 CassFuture 也是线程安全的。除了这些排除之外,一般来说,可能修改对象状态的函数不是线程安全的。不可变的对象(标记为“const”)可以被多个线程安全读取。

    他们也有关于释放对象的说明。那不是线程安全的。因此,您必须确保在释放对象之前所有线程都已完成:

    注意:对象/资源释放函数(例如 cass_cluster_free、cass_session_free、... cass_*_free)不能在对象的同一实例上同时调用。

    来源:

    http://datastax.github.io/cpp-driver/topics/

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多