Проблема уровня согласованности данных Cassandra
Я создаю объект сеанса 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);
раньше у нас было только заявление1, задержка чтения кассандры была меньше 10 мс. Когда мы добавили Statement2 и начали использовать его из одной части кода, задержка увеличилась до 250 мс для каждого вызова cassandra.
Это ошибка в datastax? Возможно ли, что
statement2.setConsistencyLevel(ConsistencyLevel.QUORUM);
устанавливает уровень согласованности ConsistencyLevel.QUORUM
за всю сессию?
Я что-то упускаю глупо?
Я использую cassandra-driver-core-3.1.3.jar
1 ответ
Решение:
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 имеет оптимизацию на месте. Итак, когда вы создаете 2-й оператор, драйвер datastax возвращает вам ссылку на первый оператор. Следовательно,
statement2.setConsistencyLevel(ConsistencyLevel.QUORUM);
заканчивает настройку уровня согласованности в первом утверждении.
Решение этой проблемы состоит в том, чтобы установить уровень согласованности для связанного оператора вместо подготовленного оператора.
например:
statement1 = session.prepare("SELECT key FROM foo WHERE key = ?");
BoundStatement boundStatement = new BoundStatement(statement1);
boundStatement.setConsistencyLevel(ConsistencyLevel.QUORUM);