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
Apache Cassandra DefaultRetryPolicy不支持网络断开连接?_Cassandra_Datastax Java Driver - Fatal编程技术网

Apache Cassandra DefaultRetryPolicy不支持网络断开连接?

Apache Cassandra DefaultRetryPolicy不支持网络断开连接?,cassandra,datastax-java-driver,Cassandra,Datastax Java Driver,我正在使用datastax cassandra driver core 3.1.0,为了开始学习cassandra,我设置了一个3节点集群(笔记本电脑中运行着3个VM) 群集连接是通过以下方式完成的(传递接触点列表): 我创建了一个测试,定期对集群执行相同的查询,并设置了consistentylevel.ONE 我的期望是,如果一个或两个节点失败,查询仍然能够得到结果(由于ConsistenceLevel.one和DefaultRetryPolicy) 发生的情况是: 如果我通过停止cassan

我正在使用datastax cassandra driver core 3.1.0,为了开始学习cassandra,我设置了一个3节点集群(笔记本电脑中运行着3个VM)

群集连接是通过以下方式完成的(传递接触点列表):

我创建了一个测试,定期对集群执行相同的查询,并设置了consistentylevel.ONE

我的期望是,如果一个或两个节点失败,查询仍然能够得到结果(由于ConsistenceLevel.one和DefaultRetryPolicy)

发生的情况是:

  • 如果我通过停止cassandra服务关闭一个或两个节点,客户机的查询就会像我期望的那样工作:它检索结果时不会出现任何问题

  • 但是,如果我实际上“断开电缆”与一台服务器的网络适配器的连接,使其无法使用,则会引发超时异常,并丢失一个查询(下一个查询能够检索数据)

  • 这不是我所期望的,我想知道这是我的错误还是java客户端库中的错误

    另一方面,如果我捕获异常并“重新执行”超时查询,它会工作,但我希望此重试将由DefaultRetryPolicy管理

    因此,为了给我的客户提供额外的健壮性,我创建了以下方法:

        protected static ResultSet executeRockSolid(Session session, BoundStatement boundStatement) {
        ResultSet results = null;
        try {
            results = session.execute(boundStatement);
        } catch (OperationTimedOutException e) {
            System.err.format("Retrying. Caused by: %s", e.toString());
            results = session.execute(boundStatement);
        } catch (TransportException e) {
            System.err.format("Retrying. Caused by: %s", e.toString());
            results = session.execute(boundStatement);
        } catch (ReadTimeoutException e) {
            System.err.format("Retrying. Caused by: %s", e.toString());
            results = session.execute(boundStatement);
        } catch (Exception e) {
            System.err.println(e);
        }
    
        return results;
    }
    
    但是,我真的不喜欢将我自己的代码用于我认为应该由客户提供的东西

    因此,问题是:

    我观察到的行为是正常的还是错误的

    如果是正常的,那么让客户端透明地支持“服务器断开网络连接”的最佳选择是什么


    如果最好的选择是创建自定义重试策略,那么参数/实现是什么?

    您是否将语句标记为幂等?不,我没有将它们设置为幂等,您是对的,在我设置语句幂等后,查询执行不会引发超时异常,但现在,“问题”已移动到session.prepareStatement方法,该方法有时会引发TransportException,如从测试应用程序日志中获取的以下示例所示:Preparing语句--------------------------------------------com.datastax.driver.core.exceptions.TransportException:[/10.0.2.15:9042]连接已关闭。下一次迭代,它将毫无例外地运行。您应该在应用程序启动时只准备一次,如果您动态地这样做,最好不要使用准备好的语句。是的,我知道,但我不能设置一致性级别或幂等性。一个简单的查询,它必须是一个准备好的语句。无论如何,在我第一次创建prepared语句时它可能会失败,对吗?创建一个SimpleStatement,您可以在没有prepared的情况下设置一致性级别和幂等项。值得注意的是,您可以忽略准备好的语句日志记录。如果它试图将一条语句发送到一个没有准备好的实例,它只会在封面下重新准备。你是否将语句标记为幂等的?不,我没有使它们成为幂等的,你是对的,在我设置语句幂等后,查询执行不会抛出超时异常,但现在,问题是已移动到session.prepareStatement方法,该方法有时会引发TransportException,如从测试应用程序日志中获取的以下示例所示:Preparing语句--------------------------------------------com.datastax.driver.core.exceptions.TransportException:[/10.0.2.15:9042]连接已关闭。下一次迭代,它将毫无例外地运行。您应该在应用程序启动时只准备一次,如果您动态地这样做,最好不要使用准备好的语句。是的,我知道,但我不能设置一致性级别或幂等性。一个简单的查询,它必须是一个准备好的语句。无论如何,在我第一次创建prepared语句时它可能会失败,对吗?创建一个SimpleStatement,您可以在没有prepared的情况下设置一致性级别和幂等项。值得注意的是,您可以忽略准备好的语句日志记录。如果它试图向一个没有准备好的实例发送一条语句,它只会在封面下重新准备
        protected static ResultSet executeRockSolid(Session session, BoundStatement boundStatement) {
        ResultSet results = null;
        try {
            results = session.execute(boundStatement);
        } catch (OperationTimedOutException e) {
            System.err.format("Retrying. Caused by: %s", e.toString());
            results = session.execute(boundStatement);
        } catch (TransportException e) {
            System.err.format("Retrying. Caused by: %s", e.toString());
            results = session.execute(boundStatement);
        } catch (ReadTimeoutException e) {
            System.err.format("Retrying. Caused by: %s", e.toString());
            results = session.execute(boundStatement);
        } catch (Exception e) {
            System.err.println(e);
        }
    
        return results;
    }