2014-05-14 3 views
0

원격 Cassandra 클러스터에 연결하는 간단한 Java 프로그램을 구현 중입니다. 이 포럼에 대한 질문과 답변을 기반으로 모든 지침을 따라 왔지만 여전히 오류가 발생했습니다. 다음은CQL3 Cassandra와의 연결

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 대안 '' '_ 이름, 비밀번호, FIRST_NAME을 선택, last_name, session_token 사용자 user_name = tigris ' 에서 org.apache.cassandra.cql.jdbc.CassandraStatement.doExecute (CassandraStatement.java:181) 에서 org.apache.cassandra.cql.jdbc.CassandraStatement.executeQuery (CassandraStatement.java:181) java : 229) at CqlConnection.main (CqlConnection.java:19) 발생 원인 : InvalidRequestException (이유 : line 0 : -1 입력시 실용적인 대안 없음 ') org.apache.cassandra.thrift.Cassandra $ execute_cql3_query_result.read (Cassandra.java:37849) at 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) 조직에서의 에서 . apache.cassandra.cql.jdbc.CassandraConnection.execute (CassandraConnection.java:468) at org.apache.cassandra.cql.jdbc.CassandraConnection.execute (CassandraConnection.java:494) at 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 guava- 17.0 libthrift-0.9.0

도움이 될 것입니다.

+1

(예 : [DataStax 자바 드라이버 (http://github.com/datastax/java-driver)보다는이 JDBC 라이브러리가 오랜 시간 업데이트되지 않았습니다. –

답변

2

나는이 문제라고 생각하는거야 : 당신이 cqlsh에서 당신이 주변에 작은 따옴표를 넣어해야한다는 것을 시도한다면

WHERE user_name=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(); 
내가 강하게 카산드라 CQL 드라이버를 사용 해 보길 제안
관련 문제