DataStax API Cassandra 执行方法 returns 有时清空结果集

DataStax API Cassandra execute method returns empty result set some times

我正在使用 DataStax API 从 Cassandra 数据库中读取记录,有时 Session 中的执行方法会出现奇怪的行为。有时它会产生空结果集,有时它会 returns 正确的结果集。

这是我的代码

    //Create session instance, using Singleton pattern
          public synchronized static Static getSession(){
          if(session !=null){
   //Not sending all the clusters

             Cluster cluster = Cluster.builder().withPort(myPort).addClusterPoints(clusters).withCredentials("username","password").
                withSocketOptions(new SocketOptions().setReadTimeoutMillis(30000).setConnectTimeoutMillis(30000)).build();
           session = cluster.connect("database");
           }
           else{
             return session;
           }
        }

        //get the session and execute query and return resultset
        public void executeQuery(){

           Session session = getSession();
           BoundStatement boundStatement = ..
           ResultSet result = session.execute(boundStatement);
           System.out.println(result.isExhausted); // true
           System.out.println(result.isFullyFetched); // true

           System.out.println(result.all().size()); /// **0 sometimes, correct count sometimes**

        }

由于某些原因,我没有发送 addClusterPoints 中的所有集群。它会产生任何问题吗?但我有时会收到 数据

这可能取决于您的复制因子 (RF) 和集群的状态。如果 RF > 1,则默认 TokenAware/DCAware 策略将尝试从任何包含副本的节点获取数据。默认情况下,查询以一致性级别 LOCAL_ONE 执行 - 这意味着来自一个副本的答案就足够了,在这种情况下,所联系的副本可能没有您需要的数据。

如果其中一个副本离线的时间长于提示的时间 window(默认为 3 小时),并且此后未执行修复,则会发生这种情况。为缓解此问题,运行 nodetool repair(具体建议取决于您的 DSE 版本 - 如果您正在使用它)。