使用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;
}
答案 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)。
无需查看和查看代码或调试,很难说清楚。