2013-02-25 35 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