DataStax API Cassandra 执行方法 returns 有时清空结果集
DataStax API Cassandra execute method returns empty result set some times
我正在使用 DataStax API 从 Cassandra 数据库中读取记录,有时 Session 中的执行方法会出现奇怪的行为。有时它会产生空结果集,有时它会 returns 正确的结果集。
这是我的代码
//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 中的所有集群。它会产生任何问题吗?但我有时会收到 数据。
这可能取决于您的复制因子 (RF) 和集群的状态。如果 RF > 1,则默认 TokenAware/DCAware 策略将尝试从任何包含副本的节点获取数据。默认情况下,查询以一致性级别 LOCAL_ONE
执行 - 这意味着来自一个副本的答案就足够了,在这种情况下,所联系的副本可能没有您需要的数据。
如果其中一个副本离线的时间长于提示的时间 window(默认为 3 小时),并且此后未执行修复,则会发生这种情况。为缓解此问题,运行 nodetool repair(具体建议取决于您的 DSE 版本 - 如果您正在使用它)。
我正在使用 DataStax API 从 Cassandra 数据库中读取记录,有时 Session 中的执行方法会出现奇怪的行为。有时它会产生空结果集,有时它会 returns 正确的结果集。
这是我的代码
//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 中的所有集群。它会产生任何问题吗?但我有时会收到 数据。
这可能取决于您的复制因子 (RF) 和集群的状态。如果 RF > 1,则默认 TokenAware/DCAware 策略将尝试从任何包含副本的节点获取数据。默认情况下,查询以一致性级别 LOCAL_ONE
执行 - 这意味着来自一个副本的答案就足够了,在这种情况下,所联系的副本可能没有您需要的数据。
如果其中一个副本离线的时间长于提示的时间 window(默认为 3 小时),并且此后未执行修复,则会发生这种情况。为缓解此问题,运行 nodetool repair(具体建议取决于您的 DSE 版本 - 如果您正在使用它)。