Cassandra查询没有任何影响

时间:2015-03-17 11:04:19

标签: cassandra datastax-java-driver

我一个接一个地运行一堆查询但是看起来有些查询没有任何影响,即使没有抛出任何错误,除非我在每次查询后重新启动会话。我正在使用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(),则每次会话关闭然后打开时执行所有查询都会导致执行缓慢。

除非在每次查询后重新启动会话,否则为什么查询无效?

1 个答案:

答案 0 :(得分:0)

我创建了一个新项目,并在我的Cassandra沙箱中尝试了您的代码。它有四个变化:

  • 我的数据中心定义为“DC1”,因此我用于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