首页 文章

Cassandra datastax一致性级别问题

提问于
浏览
1

我正在为我的应用程序创建一个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

    解:

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

相关问题