Cassandra连接 - 共享'群集'实例还是多个?

时间:2016-01-12 01:42:56

标签: java concurrency cassandra connection

在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对象是否是线程安全的?

1 个答案:

答案 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为此主题提供了进一步的指导。