Cassandra 卡桑德拉查询没有任何影响

Cassandra 卡桑德拉查询没有任何影响,cassandra,datastax-java-driver,Cassandra,Datastax Java Driver,我正在一个接一个地运行一组查询,但似乎有些查询没有任何效果,即使没有抛出错误,除非在每次查询后重新启动会话。我正在使用datastax cassandra驱动程序 以下是查询,我将其存储在一个以@@@分隔的文件中 以下是执行上述语句的代码: public class CassandraKeyspaceDelete { public static void main(String[] args) { try { new CassandraKeysp

我正在一个接一个地运行一组查询,但似乎有些查询没有任何效果,即使没有抛出错误,除非在每次查询后重新启动会话。我正在使用datastax cassandra驱动程序

以下是查询,我将其存储在一个以@@@分隔的文件中

以下是执行上述语句的代码:

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();