Java使用JDBC连接到Cassandra [SQLNonTransientConnectionException:Keyspace名称必须由字母数字和下划线组成]

时间:2016-09-09 12:31:32

标签: java jdbc cassandra

使用jdbc连接到我的Cassandra数据库时遇到问题。

我收到错误消息 SQLNonTransientConnectionException:Keyspace名称必须由字母数字和下划线组成

这是我的jdbc网址: JDBC:卡桑德拉://测试/测试@本地:7199 / tutorialspoint

堆栈跟踪:

java.sql.SQLNonTransientConnectionException: Keyspace names must be composed of alphanumerics and underscores (parsed: 'test@localhost:7199/tutorialspoint')
    at org.apache.cassandra.cql.jdbc.Utils.parseURL(Utils.java:183)
    at org.apache.cassandra.cql.jdbc.CassandraDriver.connect(CassandraDriver.java:85)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)

感谢您的帮助!

编辑: 这是我连接数据库的方法。

@Override
public boolean connect() {
    StringBuilder sb_url = new StringBuilder("jdbc:cassandra://")
            .append(this.username)
            .append("/")
            .append(this.password)
            .append("@")
            .append(this.url)
            .append(":")
            .append(this.port)
            .append("/")
            .append(this.database);



    try {
        log.debug("Trying to connect to: {}", sb_url.toString());
        this.conn = DriverManager.getConnection(sb_url.toString());
    } catch (SQLException ex) {
        log.debug("Connection to database could not been established");
        log.debug(ex.toString());
        ex.printStackTrace();
        return false;
    }
    log.debug("Connection to database has been established!");
    return true;
}

2 个答案:

答案 0 :(得分:1)

我通过更改连接网址解决了我的问题。我换了

 StringBuilder sb_url = new StringBuilder("jdbc:cassandra://")
    .append(this.username)
    .append("/")
    .append(this.password)
    .append("@")
    .append(this.url)
    .append(":")
    .append(this.port)
    .append("/")
    .append(this.database);

使用:

        StringBuilder sb_url = new StringBuilder("jdbc:cassandra://")
            .append(this.url)
            .append(":")
            .append(this.port)
            .append("/")
            .append(this.database)
            ;

    Properties props = new Properties();
    props.setProperty("user", this.username);
    props.setProperty("password", this.password);

显然正在解析URL

jdbc:cassandra://test/test@localhost:7199/tutorialspoint

导致错误,因为' @'在网址中。

我通过检查Github上的Cassandra JDBC源代码找到了解决方案 https://github.com/slowenthal/cassandra-jdbc/tree/master/src/main/java/org/apache/cassandra/cql/jdbc

我希望这对其他人也有帮助。谢谢你的帮助。

答案 1 :(得分:0)

 StringBuilder sb_url = new StringBuilder("jdbc:cassandra://")
        .append(this.username)
        .append("/")
        .append(this.password)
        .append("@")
        .append(this.url)
        .append(":")
        .append(this.port)
        .append("/")
        .append(this.database);

这部分真的很可疑。 .append(this.url)检查网址。我认为这又是一个长字符串(实际的JDBC URL)。

无需查看和查看代码或调试,很难说清楚。