2016-09-15 3 views
0

У меня есть записи уже в cassandra DB, используя Java Class Я извлекаю каждую строку, обновляю TTL и сохраняю их обратно в Cassandra DB. после этого, если я запустил select, запросите его выполнение и показ записей. но когда время TTL было завершено, если я запустил запрос select, он должен показать нулевые записи, но его не работает select запрос, показывающий ошибку Cassandra Failure during read query at consistency ONE. Для других таблиц select запрос работает правильно, но для этой таблицы (к которым строки, которые я применял TTL), не работает.Не удалось запустить запрос выбора после установки TTL в cassandra

+0

Пожалуйста, разместите схему таблиц и свои запросы. – xmas79

+0

Я использую Java для извлечения записей и изменения .. Я отредактировал сообщение с таблицей и java-кодом ... – Sat

ответ

1

Вы используете общие анти-шаблоны.

1) Вы используете партии для загрузки данных в две отдельные таблицы отдельно. Я не знаю, есть ли у вас кластер или вы находитесь на локальной машине, но это не так, как вы загружаете данные в кластер C *, и вы будете подчеркивать много вашего кластера C *. Вы должны использовать партии только тогда, когда вам нужно сохранить две или несколько таблиц в синхронизации, а не загружать кучу записей вовремя. Я предлагаю вам следующие показания по теме:

2) Вы используете синхронное пишет вставить свою довольно Самообслуживание записи в кластер. Для ускорения обработки данных необходимо использовать асинхронный.

3) Вы используете TTL функции в таблицах, которые сами по себе не так уж плохо. Однако истекло TTL является надгробным камнем, а это значит, когда вы SELECT ваш запрос C * должен будет прочитать все эти надгробные плиты.

4) Вы связываете свой подготовленный оператор несколько раз:

BoundStatement bound = phonePrepared.bind(macAddress, ... 

и что должно быть

BoundStatement bound = new BoundStatement(phonePrepared).bind(macAddress, ... 

для того, чтобы использовать различные переплетенные заявления. Это не анти-шаблон, это проблема с вашим кодом.

Теперь, если вы запускаете свою программу несколько раз, ваши таблицы имеют много надгробных камней из-за особенностей TTL, а это означает, что C * пытается прочитать все это, чтобы найти то, что вы написали «в последний раз «вы успешно запускаете, и это занимает так много времени, что тайм-аут запросов.

Просто для удовольствия, вы можете попытаться увеличить время ожидания, скажем, 2 минуты, в SELECT и взять кофе, и в то же время C * получите ваши записи назад.

Я не знаю, чего вы пытаетесь достичь, но быстрые TTL - ваши враги.Если вы только что захотели обновить свои записи, тогда постарайтесь сохранить время ТТЛ достаточно высоким, чтобы оно не повредило вашим выступлениям. Или, вероятно, лучшим решением является добавление нового столбца EXPIRED, «вручную», написанное только тогда, когда вам нужно удалить запись. Это зависит от ваших требований.