【问题标题】:Java connect to Cassandra using JDBC [SQLNonTransientConnectionException: Keyspace names must be composed of alphanumerics and underscores]Java 使用 JDBC 连接到 Cassandra [SQLNonTransientConnectionException:键空间名称必须由字母数字和下划线组成]
【发布时间】:2017-01-17 14:39:56
【问题描述】:

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

我收到一条错误消息SQLNonTransientConnectionException:键空间名称必须由字母数字和下划线组成

这是我的 jdbc 网址: jdbc:cassandra://test/test@localhost: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;
}

【问题讨论】:

  • 您的网址似乎有误。我自己没有使用 Cassandra,但它看起来应该是 jdbc:cassandra:test/test@localhost:7199/tutorialspoint(注意没有 //),另请参阅 stackoverflow.com/questions/7688571/…

标签: java jdbc cassandra


【解决方案1】:

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

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

显然是解析网址

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

由于 URL 中的“@”而导致错误。

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

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

【讨论】:

  • 只是作为附加信息,this.url 不是 jdbc url 或 sth。它是服务器的IP地址。在我的情况下,使用 localhost 对其进行了测试
【解决方案2】:
 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)。

如果不查看和周围的代码或调试,很难判断。

【讨论】:

  • 我目前无法发布我的测试代码...我将在周一编辑我的帖子。在测试环境中,我使用 url 变量“localhost”
猜你喜欢
  • 2015-08-18
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
相关资源
最近更新 更多