Проблема уровня согласованности данных 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);
Другие вопросы по тегам