2016-01-25 2 views
1

Моя ситуация такова, что, учитывая 3 следующие методы (я использовал couchbase-Java-клиент 2.2 в Scala и версии сервера Couchbase является 4,1.):Как я могу убедиться, что мой запрос N1QL рассматривает последние изменения?

def findAll() = { 
    bucket.query(N1qlQuery.simple(select("*").from(i(DatabaseBucket.USER)))) 
     .allRows().toList 
    } 

    def findById(id: UUID) = { 
    Option(bucket.get(id.toString, classOf[RawJsonDocument])).map(i => read[User](i.content())) 
    } 

    def upsert(i: User) = { 
    bucket.async().upsert(RawJsonDocument.create(i.id.toString, write(i))) 
    } 

В основном, они вставки, найти один по идентификатору и найти все. Я сделал эксперимент, в котором:

  • Я вставить User, а затем найти один за findById сразу же после этого, я получил пользователь, который я вставил правильно.

  • Вставьте, а затем я использую findAll сразу после этого, он возвращает пустой.

  • Вставить, положить 3 секунды задержки, а затем использовать findAll, я могу найти тот, который я вставил.

Таким образом, я подозревал, что N1qlQuery выполняет поиск только по кешированному слою, а не по слою «persist». Итак, как я могу заставить его искать слой «persist»?

+0

Может быть хорошо перефразировать название этого, поскольку вы заявляете это как факт, а не вопрос, а механика отличается. Предлагается: «Как я могу убедиться, что мой запрос N1QL рассматривает последние изменения?» –

ответ

3

В Couchbase 4.0 с N1QL существуют различные consistency levels, которые вы можете указать при запросе, которые соответствуют разным затратам на обновления/изменения для распространения через пересчет индекса. Они не привязаны к тому, сохраняются или нет данные, но это вариант, когда вы выдаете запрос. Значение по умолчанию «не ограничено», и чтобы убедиться, что ваш запрос upsert принят во внимание, вы захотите опубликовать этот запрос как «запрос плюс».

Чтобы получить эффект, который вы ищете, вы должны добавить N1qlPararms при создании N1qlQuery с помощью another form of the simple() method. Добавьте N1qlParams с ScanConsistency.REQUEST_PLUS. Вы можете узнать об этом в Couchbase's Developer Guide. Есть Java API example of this. С этим изменением вам не нужно будет иметь sleep(), система будет автоматически обслуживать запрос запроса после того, как пересчет индекса достигнет вашего заданного уровня.

В зависимости от того, как вы используете это в другом месте приложения, есть моменты, когда вам может понадобиться уровень согласованности.

2

Вам нужна более прочная согласованность сканирования. Добавьте N1qlParam в запрос, используя consistency(ScanConsistency.REQUEST_PLUS)