2014-09-20 68 views
-3

我已經和Cassandra合作過很多年了,覺得我多年來已經忍受了來自數據庫的足夠的BS。只是想知道爲什麼這不適用於DataStore Java驅動程序的Apache Cassandra 2.1.0(或2.0.8)w/2.1.1。這真的好像應該工作。卡桑德拉是壞了還是我犯了一個大錯誤?

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(); 
    } 

} 

我在這裏做錯了什麼,還是比較小的東西?

輸出:

連到羣集:測試羣集

結果集:結果集[耗盡:假,列[笨蛋(VARCHAR)]]尺寸:1 fullyFetched:真

MSG :空

+0

請描述_isn't working_。你期望它做什麼,爲什麼?它做什麼呢? – 2014-09-20 14:19:42

+0

最低限度,我希望它能顯示「It worked ...」字符串。相反,它沒有顯示它。 – 2014-09-20 14:25:37

+0

@AlexWhite它顯示了什麼_does_?至少連接到集羣? – 2014-09-20 14:57:13

回答

5

你調用

rs.all() 

其中,as the javadoc says

返回在這個ResultSet作爲一個列表中的其餘行。

需要注意的是,違背iterator()連續調用one()這種 方法強制一次, 獲取ResultSet中的全部內容保持一切在內存中尤其如此。因此建議 在可能的情況下更喜歡通過iterator()的迭代,特別是如果 ResultSet可能很大。

所以,當你然後做

Row one = rs.one(); 

其中,as the javadoc states,如果這ResultSet耗盡返回

下一行此ResultSet或null

它會返回null,因爲ResultSet已用盡。

你會在你的記錄,顯示您以前添加該行已經看到

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

+0

@AlexWhite是的,如果您在調用ResultSet#all()後調用ResultSet#isExhausted(),它將返回true。我不知道_fails_是什麼意思。我刪除了'all()'調用和'one()'調用,'for'循環在消耗單行之後正確地打印了'msg:broken db'。 – 2014-09-20 16:02:30

+0

@AlexWhite不,我剛剛下載Cassandra來嘗試你的例子。你一直說事情不行。編輯您的問題,發佈您嘗試運行的新代碼和_exact_輸出。然後告訴我們你的期望。 – 2014-09-20 16:08:47

+0

@AlexWhite從編輯中,您仍然調用'all()',它會使用完整的'ResultSet',一旦到達'for'循環就沒有任何東西。注意'size'是多少1。 – 2014-09-20 16:15:48