使用 cassandra-jdbc-1.2.1 jar 创建表时出错

Posted

技术标签:

【中文标题】使用 cassandra-jdbc-1.2.1 jar 创建表时出错【英文标题】:Errors when creating table using cassandra-jdbc-1.2.1 jar 【发布时间】:2013-02-28 16:31:04 【问题描述】:

我在通过 cassandra-jdbc 驱动程序在 cassandra 中创建列族(表)时遇到了一些困难。

cql 命令在 cqlsh 中正常工作,但在使用 cassandra jdbc 时不能正常工作。我怀疑这与我定义连接字符串的方式有关。任何帮助都会非常有帮助。

让我试着解释一下我做了什么。

我通过以下命令使用 cqlsh 创建了一个键空间

CREATE KEYSPACE authdb WITH 
       REPLICATION =  
                     'class' : 'SimpleStrategy', 
                     'replication_factor' : 1 
                     ;

这是根据文档:http://www.datastax.com/docs/1.2/cql_cli/cql/CREATE_KEYSPACE#cql-create-keyspace

我可以使用 cqlsh 创建一个表(列族)

 CREATE TABLE authdb.users(
    user_name varchar PRIMARY KEY,
    password varchar,
    gender varchar,
    session_token varchar,
    birth_year bigint
    );

这可以正常工作。

当我尝试使用 cassandra-jdbc-1.2.1.jar 创建表时,我的问题就开始了

我使用的代码是:

public static void createColumnFamily()  
    try 
        Class.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");
        Connection con = DriverManager.getConnection("jdbc:cassandra://localhost:9160/authdb?version=3.0.0");

        String qry = "CREATE TABLE authdb.users(" +
            "user_name varchar PRIMARY KEY," +
            "password varchar," +
            "gender varchar," +
            "session_token varchar," +
            "birth_year bigint" + 
            ")";

            Statement smt = con.createStatement();
            smt.executeUpdate(qry);
            con.close();
         catch (Exception e) 
            e.printStackTrace();
    

使用 cassandra-jdbc-1.2.1.jar 时出现以下错误:

    main DEBUG jdbc.CassandraDriver - Final Properties to Connection: cqlVersion=3.0.0, portNumber=9160, databaseName=authdb, serverName=localhost
    main DEBUG jdbc.CassandraConnection - Connected to localhost:9160 in Cluster 'authdb' using Keyspace 'Test Cluster' and CQL version '3.0.0'
    Exception in thread "main" java.lang.NoSuchMethodError: org.apache.cassandra.thrift.Cassandra$Client.execute_cql3_query(Ljava/nio/ByteBuffer;Lorg/apache/cassandra/thrift/Compression;Lorg/apache/cassandra/thrift/ConsistencyLevel;)Lorg/apache/cassandra/thrift/CqlResult;
    at org.apache.cassandra.cql.jdbc.CassandraConnection.execute(CassandraConnection.java:447)

注意:簇和键空间不正确

使用 cassandra-jdbc-1.1.2.jar 时出现以下错误:

    main DEBUG jdbc.CassandraDriver - Final Properties to Connection: cqlVersion=3.0.0, portNumber=9160, databaseName=authdb, serverName=localhost
    main INFO  jdbc.CassandraConnection - Connected to localhost:9160 using Keyspace authdb and CQL version 3.0.0
    java.sql.SQLSyntaxErrorException: Cannot execute/prepare CQL2 statement since the CQL has been set to CQL3(This might mean your client hasn't been upgraded correctly to use the new CQL3 methods introduced in Cassandra 1.2+).

注意:在这种情况下,集群和键空间似乎是正确的。

【问题讨论】:

【参考方案1】:

使用 1.2.1 jar 时的错误是因为您有旧版本的 cassandra-thrift jar。您需要使其与 cassandra-jdbc 版本保持同步。 cassandra-thrift jar 在二进制下载的 lib 目录中。

【讨论】:

太棒了——谢谢。我使用mvnrepository.com/artifact/org.apache.cassandra/… 的maven 存储库添加了cassandra-thrift jar。我使用的是 Cassandra 1.2.2,而 cassandra-thrift jar 版本是 1.2.2。我在声明 maven 依赖项时使用了最新的版本号。 org.apache.cassandracassandra-thrift1.2.2

以上是关于使用 cassandra-jdbc-1.2.1 jar 创建表时出错的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Log4j2 上使用 Slf4j 时 log4j-slf4j-impl 不依赖于 log4j-core

如何使用循环转换优化 C 代码? [关闭]

使用PHP几种写99乘法表的方式

J-Link固件烧录以及使用J-Flash向arm硬件板下载固件程序

JavaScript break 使用

如何使用J-Link远程调试?