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

Kas*_*ara 5 java scala cassandra datastax

使用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:无法使用此Cluster实例,因为它先前在com.datastax.driver.core.Cluster $ Manager.init(Cluster.java:1128)〜[cassandra-driver-core-2.0 .4.jar:na]位于com.datastax.driver.core.Cluster.init(Cluster.java:149)〜[cassandra-driver-core-2.0.4.jar:na]位于com.datastax.driver.core .cluster.connect(Cluster.java:225)〜[cassandra-driver-core-2.0.4.jar:na]在com.datastax.driver.core.Cluster.connect(Cluster.java:258)〜[cassandra- driver-core-2.0.4.jar:na]

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

有什么线索可能是这里的问题吗?

设置:

  • 一致性级别:ONE
  • 键空间复制策略:“类”:“ NetworkTopologyStrategy”,“ DC2”:“ 1”,“ DC1”:“ 1”

  • cassandra版本: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
}
Run Code Online (Sandbox Code Playgroud)

hap*_*hya 5

问题是,cluster.connect(keyspace)如果遇到NoHostAvailableException ,它将关闭群集本身。因此,在重试逻辑期间,您遇到了IllegalStateException。

看一下Cluster init()方法,您将了解更多。

在重试逻辑中,解决问题的方法是do Cluster.builder.addContactPoint(node).build.connect(keyspace)。重试时将具有新的群集对象。


Lyu*_*rov 0

在您的代码中搜索session.close().

正如评论中所述,您正在关闭某处的连接。会话一旦关闭,就无法再次使用。不要关闭连接,而是将它们集中起来以允许重复使用。