cassandra jdbc의 cql이 좋기는 하지만 consistency level 를 지정할 수 있는 방법이 최근에 추가되었다.


cassandra jdbc 1.2.1이하 버전에서는 consistency level은 모두 one으로만 동작되었다.  이를 위해서 cqlsh에서 작업할 때, 아래와 같이 consistency level을 지정해 줘야 했다.


cqlsh:userkeyspace> consistency one;

Consistency level set to ONE.



그러나, cassandar jdbc 1.2.5 버전에서 이 부분이 패치가 되었다.

https://code.google.com/a/apache-extras.org/p/cassandra-jdbc/issues/detail?id=85

https://code.google.com/a/apache-extras.org/p/cassandra-jdbc/issues/detail?id=71


 connection url에 consistent level을 지정할 수 있으며, java api를 이용해서 set/get을 할 수 있도록 해놨다.


package org.apache.cassandra.cql.jdbc;


import java.sql.Statement;


import org.apache.cassandra.thrift.ConsistencyLevel;


public interface CassandraStatementExtras extends Statement

{

    public void setConsistencyLevel(ConsistencyLevel consistencyLevel);

    

    public ConsistencyLevel getConsistencyLevel();

}




직접 하나의 예제 코드를 작성했다.


{

Class.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");

con = DriverManager.getConnection("jdbc:cassandra://localhost:9160/userkeyspace?consistency=ONE");


Statement stmt = con.createStatement();

ConsistencyLevel cl = statementExtras(stmt).getConsistencyLevel();

System.out.println("consistency level : " + cl );

}


...

    private CassandraStatementExtras statementExtras(Statement statement) throws Exception {

        Class cse = Class.forName("org.apache.cassandra.cql.jdbc.CassandraStatementExtras");

        return (CassandraStatementExtras) statement.unwrap(cse);

    }


출력 결과는 consistency=??에 맞게 제대로 출력된다. 

따라서 cql에서도 다양한 consistency level을 지정할 수 있다. 

그러나 현재로서는 hector나 java thrif처럼 쉽게 read/write 단위로 consistency level을 지정하기는 어려운 것 같다. App에서 hector나 java thrift와 비슷하게 하려면 connection을 두개를 만들어서 read/write용으로 따로 만드면 될 것 같기는 하다. 세밀한 콘트롤이 되려면 시간이 필요할 것 같다. 



* 테스트환경

- client

cassandra-driver-core-2.0.0-beta2

cassandra-thrift-2.0.1

libthrfit-0.9.1.jar

cassandra-jdbc-1.2.5.jar


- server

cassandra 2.0.1


* 참고사항

cassandra 1.2부터는  WITH CONSISTENCY LEVEL을 사용할 수 없다.

cqlsh:db_simple> SELECT * FROM test USING CONSISTENCY ONE WHERE a=1;

Bad Request: line 1:19 missing EOF at 'USING'


Posted by '김용환'
,