Java 卡桑德拉破产了还是我犯了个大错?

Java 卡桑德拉破产了还是我犯了个大错?,java,cassandra,datastax,nosql,Java,Cassandra,Datastax,Nosql,我和卡桑德拉一起工作过很多次,我觉得这些年来我已经从数据库中忍受了足够多的废话。我只是想知道为什么这在ApacheCassandra2.1.0(或2.0.8)和datastax java驱动程序的2.1.1中不起作用。看起来这真的应该管用 public class BS { public static void main(String [] args) { Cluster cluster = Cluster.builder().addContactPoint(&q

我和卡桑德拉一起工作过很多次,我觉得这些年来我已经从数据库中忍受了足够多的废话。我只是想知道为什么这在ApacheCassandra2.1.0(或2.0.8)和datastax java驱动程序的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();
    }
    
}
我是做错了什么,还是比较小的事情

产出:

已连接到群集:测试群集

结果集:ResultSet[耗尽:false,列[doof(varchar)]]大小:1 fullyFetched:true

msg:null

你在调用

rs.all()
其中,

以列表形式返回此结果集中的所有剩余行

请注意,与
iterator()
连续调用
one()
相反,此 方法强制立即获取结果集的全部内容, 特别是在记忆中记住这一切。因此,建议: 如果可能,更喜欢通过
iterator()
进行迭代,尤其是在
ResultSet
可能很大

那么,当你这样做的时候

Row one = rs.one();
返回哪一个

此结果集中的下一行或
null
(如果此
resultSet
已用尽)

由于
ResultSet
已用尽,它将返回
null

你会看到的

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

在您的日志中,显示您先前添加的行。

请描述该行不起作用。你期望它做什么?为什么?它会做什么呢?至少我希望它会显示“它工作了…”字符串。相反,它没有显示它。@AlexWhite它显示了什么
是否至少连接到集群?@AlexWhite是的,如果在调用
ResultSet#all()
之后调用
ResultSet#isexhousted()
,它将返回
true
。我不知道你说的失败是什么意思。我删除了
all()
调用和
one()
调用,并且
for
循环在消费了一行之后正确地打印
msg:breaked db
。@AlexWhite不,我只是下载了Cassandra来试试你的例子。你一直说事情不对劲。编辑您的问题,发布您试图运行的新代码和确切的输出。然后告诉我们您的期望值。@AlexWhite从您的编辑中,您仍然在调用
all()
,这将消耗完整的
ResultSet
,一旦到达
for
循环,就什么都没有了。注意
size
是如何为1的。