提问者:小点点

Scala - Cassandra:集群读取失败,出现错误“无法使用此集群实例,因为它之前已关闭”


我在使用< code>datastax驱动程序读取5节点集群中的表时出现此错误。

2015-02-19 03:24:09,908 错误 [akka.actor.default-dispatcher-9] OneForOneStrategy akka://user/HealthServiceChecker-49e686b9-e189-48e3-9aeb-a574c875a8ab 不能使用此群集实例,因为它以前已关闭 java.lang.IllegalStateException: 不能使用此群集实例,因为它之前在 com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1128) ~[cassandra-driver-core-2.0.4.jar:na] at com.datastax.driver.core.Cluster.init(Cluster.java:149) ~[cassandra-driver-core-2.0.4.jar:na] at com.datastax.driver.core.Cluster.connect(Cluster.java:225) ~[cassandra-driver-core-2.0.4.jar:na] at com.datastax.driver.core.Cluster.connect(Cluster.java:258) ~[cassandra-driver-core-2.0.4.jar:na]

我能够使用 cqlsh 连接并执行读取操作。

任何线索这里可能有什么问题?

设置:

>

  • 一致性级别:一
  • 密钥空间复制策略: “类”: “网络拓扑策略”, “DC2”: “1”, “DC1”: “1”

    卡珊德拉版本:2.0.6

    管理 Cassandra 会话的代码是核心的,它是;

    trait ConfigCassandraCluster
      extends CassandraCluster
    {
      def cassandraConf: CassandraConfig
      lazy val port = cassandraConf.port
      lazy val host = cassandraConf.host
      lazy val cluster: Cluster =
        Cluster.builder()
          .addContactPoints(host)
          .withReconnectionPolicy(new ExponentialReconnectionPolicy(100, 30000))
          .withPort(port)
          .withSocketOptions(new SocketOptions().setKeepAlive(true))
          .build()
    
      lazy val keyspace = cassandraConf.keyspace
      private lazy val casSession = cluster.connect(keyspace)
      val session = new SessionProvider(casSession)
    }
    
    class SessionProvider(casSession: => Session) extends Logging {
      var lastSuccessful: Long = 0
      var firstSuccessful: Long = -1
      def apply[T](fn: Session => T): T = {
        val result = retry(fn, 15)
        if(firstSuccessful < 0)
          firstSuccessful = System.currentTimeMillis()
        lastSuccessful = System.currentTimeMillis()
        result
      }
    
      private def retry[T](fn: Session => T, remainingAttempts: Int): T = {
        //retry logic
    }
    

  • 共2个答案

    匿名用户

    问题是,如果遇到NoHostAvailableException,< code > cluster . connect(key space)会关闭集群本身。因此,在重试逻辑期间,您会遇到IllegalStateException。

    看看Cluster init()方法,您会了解更多。

    您的问题的解决方案是在重试逻辑中执行 Cluster.builder.addContactPoint(node).build.connect(keyspace)。这将使您能够在重试时拥有新的群集对象。

    匿名用户

    在代码中搜索< code>session.close()。

    您正在关闭评论中提到的某个地方的连接。会话一旦关闭,就不能再次使用。不要关闭连接,而是将它们放在一起以便重用。