2014-09-20 2 views
-3

Я немного поработал с Кассандрой и чувствую, что на протяжении многих лет я уже с достаточным количеством банов из базы данных. Просто интересно, почему это не работает в Apache Cassandra 2.1.0 (или 2.0.8) с 2.1.1 драйвера datastax java. Кажется, это должно сработать.Является ли Кассандра сломанной или я совершил огромную ошибку?

public class BS { 

    public static void main(String [] args) { 
      Cluster cluster = Cluster.builder().addContactPoint("192.168.1.6").build(); 
      Metadata metadata = cluster.getMetadata(); 
      System.out.printf("Connected to cluster: %s\n", metadata.getClusterName()); 
      Session session = cluster.connect(); 

      session.execute("CREATE KEYSPACE IF NOT EXISTS fook WITH replication= {'class':'SimpleStrategy', 'replication_factor':1 }"); 
      session.execute("CREATE TABLE IF NOT EXISTS fook.dooftbl (id bigint PRIMARY KEY, doof text, ownerid bigint)"); 

      long id = new Random().nextLong(); 
      long ownerid = new Random().nextLong(); 
      String doof = "broken db"; 

      String load = "INSERT INTO fook.dooftbl (id,doof,ownerid) VALUES (?,?,?)"; 
      PreparedStatement ps = session.prepare(load); 
      session.execute(ps.bind(id,doof,ownerid)); 


     try { 
      String cql = "SELECT doof FROM fook.dooftbl WHERE id=?"; 
      PreparedStatement ps2 = session.prepare(cql); 
      ResultSet rs= session.execute(ps2.bind(id)); 
      System.out.println("Result set: " + rs.toString() + " size: " + rs.all().size() + " fullyFetched:" + rs.isFullyFetched()); 

      //Row one = rs.one(); 
      //if (one!=null) 
      // System.out.println("It worked. You will never have to worry about seeing this msg."); 

      String msg = null; 
      for (Row r : rs.all()) { 
       msg = r.getString("doof");    
      }   
      System.out.println("msg:" + msg); 

      } 
      catch (Exception e) { 
       e.printStackTrace();      
      } 
     cluster.close(); 
    } 

} 

Я делаю что-то неправильно здесь или это что-то относительно незначительное?

Выходы:

Подключенное кластера: Test Cluster

Вывод: ResultSet [исчерпаны: ложные, Колонны [Doof (VARCHAR)]] размер: 1 fullyFetched: истинная

MSG : нулевой

+0

Просьба описать _isn't working_. Что вы ожидаете от этого и почему? Что он делает вместо этого? –

+0

На минимальном минимуме я ожидаю, что он покажет строку «Это сработало ...». Вместо этого он не показывает это. –

+0

@AlexWhite Что _does_ это шоу? 'Подключен к кластеру? –

ответ

5

вы вызываете

rs.all() 

который, as the javadoc says,

Возвращает все остальные строки в этом ResultSet в виде списка.

Обратите внимание, что, в отличие от iterator() или последовательных вызовов one(), этого метод силы Fetching полного содержания ResultSet сразу, держа все это в памяти, в частности. Поэтому рекомендуется, чтобы предпочитал итерации по iterator(), если это возможно, особенно если ResultSet может быть большим.

Итак, когда вы делаете то

Row one = rs.one(); 

который, as the javadoc states возвращает

следующая строка в этом Resultset или null если ResultSet исчерпан.

вернет null так ResultSet исчерпан.

Вы бы видели

Result set: ResultSet[ exhausted: false, Columns[doof(varchar)]] size: 1 fullyFetched:true 

в журналах, которая показывает строку, которую вы добавили ранее.

+0

@AlexWhite Да, если вы вызываете 'ResultSet # isExhausted()' после вызова 'ResultSet # all()', он вернет 'true'. Я не знаю, что вы подразумеваете под _fails_.Я удаляю вызов 'all()' и вызов 'one()', а цикл 'for' корректно печатает' msg: broken db' после потребления одной строки. –

+0

@AlexWhite Нет, я просто скачал Кассандру, чтобы попробовать ваш пример. Вы продолжаете говорить, что все не работает. Измените свой вопрос, опубликуйте новый код, который вы пытаетесь запустить, и вывод _exact_. Тогда скажите нам, чего вы ожидали. –

+0

@AlexWhite Из вашего редактирования вы все еще вызываете 'all()', который потребляет полный 'ResultSet', ничего не осталось, как только вы достигнете цикла' for'. Обратите внимание, как «размер» равен 1. –

Смежные вопросы