在Java项目中使用Cassandra driver时,管理连接的最佳做法是什么?特别是关于允许多个线程共享单个Cluster
实例或为需要与Cassandra通信的每个线程分配单独的Cluster
实例是否更好的做法。
我关注了example code,并设置了我的Cluster
实例,如:
Cluster.builder().addContactPoint(HOST).withPort(PORT)
.withCredentials(USER, PASS).build();
所以我要问的是首选方法是做这样的事情(单个共享Cluster
实例):
private static Cluster _cluster = null;
public static Cluster connect() {
if (_cluster != null && ! _cluster.isClosed()) {
//return the cached instance
return _cluster;
}
//create a new instance
_cluster = Cluster.builder().addContactPoint(HOST).withPort(PORT)
.withCredentials(USER, PASS).build();
return _cluster;
}
...或者最好还是返回多个Cluster
个实例?像这样:
public static Cluster connect() {
//every caller gets their own Cluster instance
return Cluster.builder().addContactPoint(HOST).withPort(PORT)
.withCredentials(USER, PASS).build();
}
我想这个问题的核心点是:
Cluster
实例是一项昂贵的操作吗?Cluster
对象是内部管理/池连接到后备数据存储区,还是更像是单个连接的抽象?Cluster
对象是否是线程安全的?答案 0 :(得分:4)
构建新的Cluster实例是一项昂贵的操作吗?
调用构建来构建集群实例不会产生网络IO,因此这是一项非常昂贵的操作。
Cluster对象是内部管理/池连接到后备数据存储区,还是更像是单个连接的抽象?
成本高昂的是调用cluster.init()
,它会为您的某个联系点创建一个连接(控制连接)。 cluster.connect()
因为它进入群集(如果它还没有)而更加昂贵,并创建一个管理连接池的Session
(池大小基于您的PoolingOptions )每个发现的主机。是的,Cluster
有一个控制连接'管理主机状态,通过Session
创建的每个Cluster.connect()
都有一个连接池到每个主机。
Cluster对象是否是线程安全的?
简单地说,是的:)
4 simple rules when using the DataStax drivers for Cassandra为此主题提供了进一步的指导。