我在使用< 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
}
问题是,如果遇到NoHostAvailableException,< code > cluster . connect(key space)会关闭集群本身。因此,在重试逻辑期间,您会遇到IllegalStateException。
看看Cluster init()
方法,您会了解更多。
您的问题的解决方案是在重试逻辑中执行 Cluster.builder.addContactPoint(node).build.connect(keyspace)。
这将使您能够在重试时拥有新的群集对象。
在代码中搜索< code>session.close()。
您正在关闭评论中提到的某个地方的连接。会话一旦关闭,就不能再次使用。不要关闭连接,而是将它们放在一起以便重用。