CQL3与Cassandra的连接

时间:2014-05-14 18:47:32

标签: cassandra cql

我正在实现一个连接到远程Cassandra集群的简单Java程序。我已根据此论坛上的问题和答案执行了所有说明,但仍然出现错误。以下是java代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DataReader {

public static void main(String[] args) throws Exception {

  Connection con = null;
  try {
   Class.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");
   con = DriverManager.getConnection("jdbc:cassandra://62.31.3.185:9160/proto");

   String query = "SELECT user_name, password, first_name, last_name, session_token   
          FROM users WHERE user_name=tigris";
   Statement stmt = con.createStatement();
   ResultSet result = stmt.executeQuery(query);

   while (result.next()) {
      System.out.println(result.getString("user_name"));
      System.out.println(result.getString("password"));
      System.out.println(result.getString("first_name"));
      System.out.println(result.getString("last_name"));
      System.out.println(result.getString("session_token"));
   }

 } catch (ClassNotFoundException e) {
   e.printStackTrace();
 } catch (SQLException e) {
   e.printStackTrace();
 } finally {
   if (con != null) {
   try {
     con.close();
   } catch (SQLException e) {
     e.printStackTrace();
   }
     con = null;
   }
  }
 }
} 

下面是堆栈跟踪:

java.sql.SQLSyntaxErrorException:第0行:-1输入中没有可行的选择'' ' SELECT user_name,password,first_name,last_name,session_token FROM users WHERE user_name = tigris'         在org.apache.cassandra.cql.jdbc.CassandraStatement.doExecute(CassandraStatement.java:181)         在org.apache.cassandra.cql.jdbc.CassandraStatement.executeQuery(CassandraStatement.java:229)         在CqlConnection.main(CqlConnection.java:19) 引起:InvalidRequestException(为什么:第0行:-1在输入时没有可行的选择'')         在org.apache.cassandra.thrift.Cassandra $ execute_cql3_query_result.read(Cassandra.java:37849)         在org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)         在org.apache.cassandra.thrift.Cassandra $ Client.recv_execute_cql3_query(Cassandra.java:1562)         在org.apache.cassandra.thrift.Cassandra $ Client.execute_cql3_query(Cassandra.java:1547)         在org.apache.cassandra.cql.jdbc.CassandraConnection.execute(CassandraConnection.java:468)         在org.apache.cassandra.cql.jdbc.CassandraConnection.execute(CassandraConnection.java:494)         在org.apache.cassandra.cql.jdbc.CassandraStatement.doExecute(CassandraStatement.java:164)         ......还有2个

我的类路径中有以下库:

卡桑德拉-clientutil-1.2.6 卡桑德拉 - clientutil-2.0.7 卡桑德拉-JDBC-1.2.5 卡桑德拉 - 节俭1.2.6 番石榴17.0 libthrift-0.9.0

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我猜这是你的问题:

WHERE user_name=tigris

如果你要从cqlsh尝试,你必须在“tigris”周围加上单引号,如下所示:

WHERE user_name='tigris'

这就是你必须要做的就是在这里工作。

当然,如果您使用预准备语句和绑定变量,则可以完全避免此问题。这是看起来的样子:

String query = "SELECT user_name, password, first_name, last_name, session_token   
      FROM users WHERE user_name=?";
PreparedStatement stmt = con.prepareStatement(query);

stmt.setString(1, "tigris");
ResultSet result = stmt.executeQuery();