Couchbase 2.0 Java SDK 1.1 - 同步添加和视图

时间:2013-02-25 22:34:28

标签: java sdk couchbase

我正在尝试创建一个junit测试。情形:

  • setUp:我正在向数据库添加两个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文档是: { “用户id”: “1”, “providerId”: “test_pId”, “providerUserId”: “test_pUId”, “类型”: “UserConnection”} { “用户id”: “2”, “providerId”: “test_pId”, “providerUserId”: “test_pUId”, “类型”: “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);


问题:

  • 由于从视图中获取的元素数量无效,测试失败。

我的观察:

我的问题:

  • 在将数据插入数据库后,我是如何接近从视图中获取数据的?解决这个问题有什么好的做法吗?请有人向我解释一下我做错了什么?

谢谢,
达留

1 个答案:

答案 0 :(得分: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。