2013-02-25 36 views
1

我正在嘗試創建junit測試。場景:Couchbase 2.0 Java SDK 1.1 - 同步添加和視圖

  • 設置:我增加了兩個JSON文件數據庫
  • 測試:我使用的視圖
  • 拆解得到這些文件:我刪除這兩個對象

我的觀點:

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)

  • 當我添加了這些

    我的問題:

    • 有什麼錯我是如何處理這些數據插入到數據庫後立即取出由視圖數據?有沒有解決這個問題的好習慣?有人能解釋給我,請問我做錯了什麼?

    謝謝
    達留

  • 回答

    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 – 2013-02-27 19:17:29

    +0

    謝謝!看來這兩者的結合解決了這個問題。 – 2013-03-03 22:04:13