Cassandra datastax一致性级别问题

时间:2018-02-15 23:15:49

标签: java cassandra datastax-java-driver

我正在为我的应用程序创建一个cassandra会话对象,并为它创建一些预备语句。在每个预准备语句上设置不同的一致性级

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);

之前我们只有statement1,cassandra读取延迟小于10毫秒。 当我们添加statement2并从代码的一部分开始使用它时,每个cassandra调用的延迟增加到250毫秒。

这是datastax中的错误吗?是否可能

statement2.setConsistencyLevel(ConsistencyLevel.QUORUM);

是否将整个会话的一致性级别设置为ConsistencyLevel.QUORUM

我错过了一些愚蠢的事吗?

我正在使用cassandra-driver-core-3.1.3.jar

1 个答案:

答案 0 :(得分:0)

解决方案:

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

这两个准备好的语句完全相同,意味着查询字符串相同:“SELECT key FROM foo WHERE key = ?

cassandra datastax驱动器已经进行了优化。因此,当您创建第二个语句时,datastax驱动程序会返回第一个语句的引用。因此,

statement2.setConsistencyLevel(ConsistencyLevel.QUORUM);

最终在第一个语句上设置一致性级别。

解决此问题的方法是在绑定语句而不是预准备语句上设置一致性级别。

例如:

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