Java 卡桑德拉破产了还是我犯了个大错?
我和卡桑德拉一起工作过很多次,我觉得这些年来我已经从数据库中忍受了足够多的废话。我只是想知道为什么这在ApacheCassandra2.1.0(或2.0.8)和datastax java驱动程序的2.1.1中不起作用。看起来这真的应该管用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
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的。