简体   繁体   中英

Cassandra datastax consistency level issue

I am creating a cassandra session object for my application and creating few prepared statements for it. Setting different consistency levels on each prepared statement.

statement1 = session.prepare("SELECT key FROM foo WHERE key = ?");
statement1.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);

statement2 = session.prepare("SELECT key FROM foo WHERE key = ?");
statement2.setConsistencyLevel(ConsistencyLevel.QUORUM);

we only had statement1 before, cassandra read latency was less than 10 ms. when we added statement2 and started using it from one part of the code, latency increased to 250 ms for every cassandra calls.

Is this a bug in datastax? Is it possible that

statement2.setConsistencyLevel(ConsistencyLevel.QUORUM);

is setting consistency level to ConsistencyLevel.QUORUM for entire session?

Am I missing something silly?

I am using cassandra-driver-core-3.1.3.jar

Solution:

statement1 = session.prepare("SELECT key FROM foo WHERE key = ?");
statement2 = session.prepare("SELECT key FROM foo WHERE key = ?");

These two prepared statements were exactly same, meaning query string is same: " SELECT key FROM foo WHERE key = ? "

cassandra datastax drive has optimization in place. So, when you create 2nd statement, datastax driver returns you the reference of first statement. Hence,

statement2.setConsistencyLevel(ConsistencyLevel.QUORUM);

ends up setting consistency level on the first statement.

Solution to this problem is to set consistency level on bound statement instead of a prepared statement.

eg:

statement1 = session.prepare("SELECT key FROM foo WHERE key = ?");
BoundStatement boundStatement = new BoundStatement(statement1); 
boundStatement.setConsistencyLevel(ConsistencyLevel.QUORUM);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM