Cassandra 卡桑德拉查询没有任何影响
我正在一个接一个地运行一组查询,但似乎有些查询没有任何效果,即使没有抛出错误,除非在每次查询后重新启动会话。我正在使用datastax cassandra驱动程序 以下是查询,我将其存储在一个以@@@分隔的文件中 以下是执行上述语句的代码:Cassandra 卡桑德拉查询没有任何影响,cassandra,datastax-java-driver,Cassandra,Datastax Java Driver,我正在一个接一个地运行一组查询,但似乎有些查询没有任何效果,即使没有抛出错误,除非在每次查询后重新启动会话。我正在使用datastax cassandra驱动程序 以下是查询,我将其存储在一个以@@@分隔的文件中 以下是执行上述语句的代码: public class CassandraKeyspaceDelete { public static void main(String[] args) { try { new CassandraKeysp
public class CassandraKeyspaceDelete {
public static void main(String[] args) {
try {
new CassandraKeyspaceDelete().run();
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
// Get file from resources folder
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("create_keyspace.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder out = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
out.append(line);
}
// read from input stream
reader.close();
} catch (Exception e) {
System.out.println("Error reading kespace creation script.");
return;
}
// System.out.println();
com.datastax.driver.core.Session readSession = CassandraManager.connect("12.10.1.122", "", "READ");
String selectStmnts[] = out.toString().split("@@@@");// { };
for (String selectStmnt : selectStmnts) {
System.out.println("" + selectStmnt.trim());
if (selectStmnt.trim().length() > 0) {
ResultSet res = readSession.execute(selectStmnt.trim());
}
// readSession.close();
if (readSession.isClosed()) {
readSession = CassandraManager.connect("12.10.1.122", "", "READ");
}
}
System.out.println("Done");
return;
}
}
下面是CassandraManager类:
public class CassandraManager {
static Cluster cluster;
public static Session session;
static PreparedStatement statement;
static BoundStatement boundStatement;
public static HashMap<String, Session> sessionStore = new HashMap<String, Session>();
public static Session connect(String ip, String keySpace,String type) {
PoolingOptions poolingOpts = new PoolingOptions();
poolingOpts.setCoreConnectionsPerHost(HostDistance.REMOTE, 2);
poolingOpts.setMaxConnectionsPerHost(HostDistance.REMOTE, 400);
poolingOpts.setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.REMOTE, 128);
poolingOpts.setMinSimultaneousRequestsPerConnectionThreshold(HostDistance.REMOTE, 2);
cluster = Cluster
.builder()
.withPoolingOptions( poolingOpts )
.addContactPoint(ip)
.withRetryPolicy( DowngradingConsistencyRetryPolicy.INSTANCE )
.withReconnectionPolicy( new ConstantReconnectionPolicy( 100L ) ).build();
Session s = cluster.connect();
return s;
}
}
当我运行它时,前两个CQL查询运行时没有错误。当第三个运行时,我得到一个错误,说Keyspace test_空间不存在。
如果我取消对readSession.close的注释,则每次会话关闭然后打开时,所有查询都会执行,导致执行缓慢
为什么只有在每次查询后重新启动会话,查询才能工作 我创建了一个新项目,并在我的Cassandra沙箱中尝试了您的代码。它有四个变化: 我的数据中心定义为DC1,因此我用于测试空间键空间的复制因子为{'class':'NetworkTopologyStrategy','DC1':'1'}; 我的沙盒实例是安全的,因此我必须在Cluster.builder中使用.withCredentials 我无法让getResourceAsStream工作,所以我用FileInputStream替换了它。 我移动了readSession.close;在for循环之外。 基于它在我身上起作用的事实,我无法与你看到的行为对话,因此我将提供一些观察结果: 您的数据中心是否真的命名为0?您的密钥空间复制因子{'class':'NetworkTopologyStrategy','0':'2'}告诉Cassandra在0数据中心中放置两个副本。如果确实如此,您应该让数据中心的名称更直观一些。 文本文件中的任何语句都不会返回结果集。这样做的结果集res=readSession.executeselectStmnt.trim;真的什么都帮不了你。 给定键空间的名称,我只能假设您正在测试一些东西。那么,您如何知道在集群构建器上需要所有这些选项呢?我给你的建议是,从简单开始。不要添加其他选项,除非你知道你需要它们,更重要的是,它们是做什么的
cluster = Cluster.builder()
.addContactPoint(ip)
.build();
Session s = cluster.connect();
确保您的readSession.close;在您的for循环之外
另一个可能对你有帮助的方法是阅读DataStax的丽贝卡·米尔斯(Rebecca Mills)
cluster = Cluster.builder()
.addContactPoint(ip)
.build();
Session s = cluster.connect();