2013-02-25 4 views
1

Я пытаюсь создать тест junit. Сценарий:Couchbase 2.0 Java SDK 1.1 - Synchronous Add and Views

  • нАлАдкА: Я добавляю два JSon документов в базу данных
  • Тест: Я получаю эти документы с использованием представления
  • Teardown: Я удаляю обоих объектов

Мое мнение:

function (doc, meta) { 
    if (doc.type && doc.type == "UserConnection") { 
    emit([doc.providerId, doc.providerUserId], doc.userId); 
    } 
} 


Это, как я добавить эти документы в базу данных и убедитесь, что "добавить" синхронно:

public boolean add(String key, Object element) { 
    String json = gson.toJson(element); 
    OperationFuture<Boolean> result = couchbaseClient.add(key, 0, json); 
    return result.get(); 
} 


JSON Документы, которые я добавляю являются: {» userId ":" 1 "," providerId ":" test_pId "," providerUserId ":" test_pUId "," type ":" UserConnection "} {" userId ":" 2 "," providerId ":" test_pId "," providerUserId ":" test_pUId "," type ":" UserConnection "}

Это, как я называю мнение:

View view = couchbaseClient.getView(DESIGN_DOCUMENT_NAME, VIEW_NAME); 
Query query = new Query(); 
query.setKey(ComplexKey.of("test_pId", "test_pUId")); 
ViewResponse viewResponse = couchbaseClient.query(view, query); 


Проблема:

  • Тест терпит неудачу из-за неверное число элементов принесенных из поля зрения.

Мои наблюдения:

  • Иногда тесты проходят
  • Количество элементов, которые извлекаются из поля зрения не соответствует (от 0 до 2)
  • Когда я добавил те, документы в базу данных вместо вызова setUp тест передается каждый раз
  • В соответствии с этим http://www.couchbase.com/docs/couchbase-sdk-java-1.1/create-update-docs.html документация Я добавляю эти json-документы синхронно y, вызвав get() в возвращаемом объекте Future.

Мой вопрос:

  • Есть ли что-то не так с тем, как я подошел к выборке данных из поля зрения только после того, как эти данные были вставлены в БД? Есть ли хорошая практика для решения этой проблемы? И может кто-нибудь объяснить это мне, пожалуйста, что я сделал неправильно?

Спасибо,
Дариуш

ответ

1

В Couchbase 2.0 документы должны быть записаны на диск, прежде чем они будут отображаться в представлении. Существует три способа выполнить операцию с Java SDK. Первый асинхронный, что означает, что вы просто отправляете данные и позже проверяете, чтобы данные были получены правильно. Если вы выполняете асинхронную операцию, а затем сразу вызываете .get(), как вы это делали выше, вы создали синхронную операцию. Когда операция возвращает успех в этих двух случаях выше, вы гарантируете, что элемент был записан в память. Ваш тест проходил иногда только потому, что вам повезло, что оба элемента были записаны на диск перед вашим запросом.

Третий способ выполнить операцию - это требования к долговечности, и это именно то, что вы хотите сделать для своих тестов. Требования долговечности позволяют утверждать, что вы хотите, чтобы элемент был записан на диск или реплицирован, прежде чем успех будет возвращен клиенту. Посмотрите на следующую функцию.

https://github.com/couchbase/couchbase-java-client/blob/1.1.0/src/main/java/com/couchbase/client/CouchbaseClient.java#L1293

Вы хотите использовать эту функцию и установите параметр PersistedTo на MASTER.

+0

В дополнение к PersistTo, чтобы быть уверенным, что на вашем диске вам также нужно вызвать представление, используя stale = false, убедитесь, что индекс обновлен, прежде чем возвращать его в ваше приложение. Взгляните на: http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views-writing-stale.html –

+0

Спасибо! Кажется, что сочетание обоих решений проблемы. –