Метод выполнения DataStax API Cassandra несколько раз возвращает пустой набор результатов. - PullRequest
0 голосов
/ 30 апреля 2018

Я использую DataStax API для чтения записей из базы данных Cassandra. Иногда метод execute в Session показывает странное поведение. Иногда это приводит к пустому набору результатов, иногда возвращает правильный набор результатов.

Вот мой код

    //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 по некоторым причинам. Это создает какие-либо проблемы? Но иногда я получаю данные .

1 Ответ

0 голосов
/ 01 мая 2018

Это может зависеть от вашего коэффициента репликации (RF) и состояния вашего кластера. Если у вас RF> 1, то политика TokenAware / DCAware по умолчанию будет пытаться получить данные с любого из узлов, содержащих реплику. По умолчанию запрос выполняется с уровнем согласованности LOCAL_ONE - это означает, что ответа от одной реплики достаточно, и в этом случае может оказаться, что с репликой, с которой происходит связь, нет нужных вам данных.

Это происходит, если одна из реплик находилась в автономном режиме в течение времени, превышающего размер временного окна для подсказок (по умолчанию 3 часа), и этот ремонт впоследствии не выполнялся. Чтобы решить эту проблему, запустите исправление nodetool (точная рекомендация зависит от вашей версии DSE - если вы ее используете).

...