Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 检查与Cassandra Datastax Java驱动程序的会话_Session_Cassandra_Datastax Java Driver - Fatal编程技术网

Session 检查与Cassandra Datastax Java驱动程序的会话

Session 检查与Cassandra Datastax Java驱动程序的会话,session,cassandra,datastax-java-driver,Session,Cassandra,Datastax Java Driver,是否有任何直接方法可以检查群集/会话是否已连接/有效/正常 我的意思是,我有一个com.datastax.driver.core.Session被创建到一个无休止的线程中,我想确保每次需要时会话都是正常的。我使用下一个集群初始化,但我不确定这是否足够 Cluster.builder().addContactPoint(url) .withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE) .withReconnectionPolicy(

是否有任何直接方法可以检查群集/会话是否已连接/有效/正常

我的意思是,我有一个com.datastax.driver.core.Session被创建到一个无休止的线程中,我想确保每次需要时会话都是正常的。我使用下一个集群初始化,但我不确定这是否足够

Cluster.builder().addContactPoint(url)
.withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)
.withReconnectionPolicy(new ConstantReconnectionPolicy(1000L)).build());

事实上,在使用DataStax Java驱动程序时,您嵌入了一个隐藏/神奇的功能:

驱动程序知道完整的网络拓扑(跨数据中心的节点拓扑和节点可用性)

因此,您需要做的唯一一件事就是使用几个节点(1)初始化集群,然后您可以随时确保,如果至少有一个可用节点,您的请求将正确执行。因为驱动程序是拓扑感知的,如果一个节点(甚至初始化节点)不可用,驱动程序将自动将您的请求路由到另一个可用节点

总之,您的代码很好(1


1):您应该提供一些节点,以便在集群初始化阶段具有容错能力。事实上,如果一个初始化节点关闭,那么驱动程序就有可能联系另一个节点来发现完整的拓扑结构。

我有一个本地开发环境设置,在那里我同时启动java应用程序和Cassandra(Docker)容器,因此,当java应用程序首次尝试连接时,Cassandra通常不会处于就绪状态

启动时,当
集群
实例尝试创建
会话时,应用程序将抛出
NoHostAvailableException
。随后尝试从
集群创建
会话
将抛出
非法状态异常
,因为集群实例在第一次异常后关闭

我所做的是创建一个检查方法,尝试创建集群和会话,然后立即关闭它们。见此:

private void waitForCassandraToBeReady(String keyspace, Cluster.Builder builder) {
    RuntimeException exception = null;
    int retries = 0;

    while (retries++ < 40) {
        Session session = null;
        Cluster cluster = null;
        try {
            cluster = builder.build();
            session = cluster.connect(keyspace);
            log.info("Cassandra is available");
            return;
        } catch (RuntimeException e) {
            log.warn("Cassandra not available, try {}", retries);
            exception = e;
        } finally {
            if (session != null && !session.isClosed()) session.close();
            if (cluster != null && !cluster.isClosed()) cluster.close();
        }
        sleep();
    }
    log.error("Retries exceeded waiting for Cassandra to be available");

    if (exception != null) throw exception;
    else throw new RuntimeException("Cassandra not available");
}
private void waitForCassandraToBeReady(字符串键空间,Cluster.Builder){
RuntimeException=null;
int重试次数=0;
while(重试次数+++<40次){
会话=空;
Cluster=null;
试一试{
cluster=builder.build();
会话=cluster.connect(键空间);
log.info(“可获得Cassandra”);
返回;
}捕获(运行时异常e){
warn(“Cassandra不可用,请尝试{}”,重试);
例外=e;
}最后{
如果(session!=null&&!session.isClosed())session.close();
如果(cluster!=null&&!cluster.isClosed())cluster.close();
}
睡眠();
}
log.error(“等待Cassandra可用时超过重试次数”);
如果(异常!=null)抛出异常;
否则抛出新的运行时异常(“Cassandra不可用”);
}
此方法返回后,我将创建一个独立于此检查方法的
集群
会话