C++ cassandra会话是线程安全的吗?(使用cpp驱动程序)

C++ cassandra会话是线程安全的吗?(使用cpp驱动程序),c++,multithreading,cassandra,client,C++,Multithreading,Cassandra,Client,我正在开发一个多线程应用程序,并使用Cassandra作为后端 前面,我为每个子线程创建了一个单独的会话,并在线程执行后终止该线程之前关闭了该会话。但后来我认为这可能是一项昂贵的工作,所以我现在将其设计为,在服务器开始时打开一个会话,任何数量的客户端都可以使用该会话进行查询 问题:我只想知道这是正确的,还是有更好的方法?我知道连接池是一种选择,但是,在这种情况下真的需要吗?< p>它在java驱动程序中是线程安全的,所以我假设C++驱动程序是相同的。 我们鼓励您只创建一个会话,并让所有线程使用它

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

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


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

< p>它在java驱动程序中是线程安全的,所以我假设C++驱动程序是相同的。 我们鼓励您只创建一个会话,并让所有线程使用它,以便驱动程序能够高效地维护到集群的连接池,并异步处理来自客户端线程的命令

如果在一台客户机上创建多个会话,或者继续打开和关闭会话,则会迫使驱动程序继续建立和断开与集群的连接,这将浪费资源

在使用Cassandra的DataStax驱动程序时,请引用4条简单规则:

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

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

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

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

    cassession被设计为从多个线程并发使用。CassFuture也是线程安全的
    。除了这些排除,通常,可能修改对象状态的函数不是线程安全的。多线程可以安全地读取不可变(标记为“const”)的对象

    它们还有一个关于释放对象的注释。这不是线程安全的。因此,在释放对象之前,必须确保所有线程都已完成:

    注意:对象/资源空闲函数(例如cass_集群空闲、cass_会话空闲、…cass_*_空闲)不能在对象的同一实例上同时调用

    资料来源:


    那么你是说连接池是由驱动程序本身完成的?!这是正确的。Cassandra是高度异步的,因此驱动程序可以使用到节点的单个连接来执行许多事务。为了实现负载平衡,驱动程序会打开到多个Cassandra节点的持久连接,并且可以高效地管理和使用连接池。