我一个接一个地运行一堆查询但是看起来有些查询没有任何影响,即使没有抛出任何错误,除非我在每次查询后重新启动会话。我正在使用datastax cassandra driver
。
以下是我在@@@
分隔的文件中存储的查询。
DROP KEYSPACE if exists test_space;
@@@@
CREATE KEYSPACE test_space WITH replication = {'class': 'NetworkTopologyStrategy','0':'2'};
@@@@
CREATE TABLE test_space.fr_core (
frid text PRIMARY KEY,
attributes text,
pk1 text,
pk2 text,
pk3 text,
pk4 text,
pk5 text,
pk6 text
);
@@@@
这是执行上述陈述的代码:
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_space
不存在。
如果我取消注释readSession.close()
,则每次会话关闭然后打开时执行所有查询都会导致执行缓慢。
除非在每次查询后重新启动会话,否则为什么查询无效?
答案 0 :(得分:0)
我创建了一个新项目,并在我的Cassandra沙箱中尝试了您的代码。它有四个变化:
test_space
键空间的复制因子为{'class': 'NetworkTopologyStrategy','DC1':'1'};
.withCredentials
Cluster.builder
getResourceAsStream
工作,所以我用FileInputStream
代替了。readSession.close();
移到for
循环之外。基于它对我有用的事实,我无法谈论你所看到的行为,所以我将提供一些观察:
0
?密钥空间复制因子{'class': 'NetworkTopologyStrategy','0':'2'}
告诉Cassandra在0
数据中心放置两个副本。如果确实如此,您应该使您的数据中心名称更加直观。ResultSet res = readSession.execute(selectStmnt.trim());
真的不会给你什么。 鉴于你的密钥空间的名称,我只能假设你正在测试一些东西。那么您如何知道在集群构建器上需要所有这些选项?我给你的建议是,从简单开始。除非您知道自己需要这些选项,否则不要添加其他选项,更重要的是,他们会做什么。
cluster = Cluster.builder()
.addContactPoint(ip)
.build();
Session s = cluster.connect();
确保您的readSession.close();
不在for
循环中。
其他可能对您有所帮助的是DataStax的Rebecca Mills阅读Things You Should Be Doing When Using Cassandra Drivers。