Sud*_*han 4 c++ client multithreading cassandra
我正在开发一个多线程应用程序,并使用Cassandra作为后端.
之前,我为每个子线程创建了一个单独的会话,并在执行后杀死线程之前关闭了会话.但后来我认为这可能是一项昂贵的工作,所以我现在设计它就像,我在服务器启动时打开了一个会话,任何数量的客户端都可以使用该会话进行查询.
问题:我只是想知道这是否是正确的方式,还是有更好的方法来做到这一点?我知道连接池是一种选择,但在这种情况下真的需要吗?
它在Java驱动程序中肯定是线程安全的,所以我假设C++驱动程序是相同的.
建议您仅创建一个会话并让所有线程使用它,以便驱动程序可以有效地维护到集群的连接池,并异步处理来自客户端线程的命令.
如果在一台客户端计算机上创建多个会话或继续打开和关闭会话,则会强制驱动程序继续建立和删除与群集的连接,这会浪费资源.
在使用Cassandra的DataStax驱动程序时,引用此Datastax博客文章关于4个简单规则:
- 每个(物理)集群使用一个集群实例(每个应用程序生命周期)
- 每个键空间最多使用一个会话,或使用单个会话并明确指定查询中的键空间
- 如果多次执行语句,请考虑使用PreparedStatement
- 您可以通过使用批次减少网络往返次数并进行原子操作
C/C++ 驱动程序在会话级别和未来级别绝对是线程安全的。
\n\n\n\n\nCassSession 对象用于查询执行。在内部,会话对象还管理与 Cassandra 的客户端连接池,并使用负载平衡策略在这些连接之间分配请求。应用程序应该为每个键空间创建一个会话对象,因为会话对象被设计为一次创建、重用并由应用程序内的多个线程共享。
\n
他们实际上有一个名为“线程安全”的部分:
\n\n\n\n\nCassSession被设计为在多个线程中同时使用。CassFuture 也是线程安全的。除了这些排除之外,一般来说,可能修改 object\xe2\x80\x99s 状态的函数不是线程安全的。不可变的对象(标记为 \xe2\x80\x98const\xe2\x80\x99)可以由多个线程安全地读取。
\n
他们还有关于释放对象的注释。那不是线程安全的。因此,在释放对象之前,您必须确保所有线程都已完成:
\n\n\n\n\n注意:对象/资源释放函数(例如cass_cluster_free、cass_session_free、\xe2\x80\xa6 cass_*_free)不能在同一对象实例上同时调用。
\n
来源:
\n\nhttp://datastax.github.io/cpp-driver/topics/
\n| 归档时间: |
|
| 查看次数: |
2266 次 |
| 最近记录: |