Couchbase中的多个插入失败

时间:2014-09-03 10:08:49

标签: couchbase nosql

Couchbase新手问题:

我正在尝试在couchbase中插入100万条记录,但我发现插入了近50万条记录(管理控制台显示517365作为项目计数)。 此外,从管理GUI,我只能看到1000条记录(10页,每页100条记录)

我想知道其他记录在哪里消失了!

1)有人可以帮我这个吗?

2)我应该查看哪个日志文件来查找插入失败错误?

我怀疑Couchbase有一个内部队列。一旦它满了,进一步的请求就会被删除。如果是,那么如何配置队列大小?

PS:我尝试查看日志C:\ Program Files \ Couchbase \ Server \ var \ lib \ couchbase \ logs,但无法找出任何内容。

public class Test {
    public static void main(String[] args) {
        ArrayList<URI> nodes = new ArrayList<URI>();
        String cbUrl = "http://127.0.0.1:8091/pools";
        String dbName = "deafult";
        CouchbaseClient client = null;
        try {
            nodes.add(URI.create(cbUrl));

            client = new CouchbaseClient(nodes, dbName, "");

            insertRecords(client);

            System.out.println("Test Over");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // client.shutdown();
        }
    }

    public static void insertRecords(CouchbaseClient client) throws Exception {
        int num = 1000000;

        for (int n = 1; n <= num; n++) {
            System.out.println("Adding: " + n);
            client.set(n + "", 0, n + "");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

Couchbase Java SDK中的set操作是异步的。这意味着一旦呼叫返回,就无法保证您甚至已将操作发送到Couchbase,因为它甚至可能尚未写入网络缓冲区。为了确保操作已经完成,您需要在set()API返回的对象(这是一个Future)上调用get()函数。

换句话说,替换这一行:

client.set(n + "", 0, n + "");

这一个:

client.set(n + "", 0, n + "").get();

答案 1 :(得分:0)

要扩展@ mikewied的答案,检查所有1,000,000个设置操作是否已完成,而必须在每个操作上明确调用.get()(因此转换来自async to sync),你需要在每个集合中添加一个监听器,它跟踪你的操作已经完成了多少。

blog post宣布Couchbase Java SDK 1.2中,有一个很好的例子: -

final CountDownLatch latch = new CountDownLatch(100);
for (int i = 0; i < 100; i++) {
  OperationFuture<Boolean> future = client.set("key-" + i, "value");
  future.addListener(new OperationCompletionListener() {
    @Override
    public void onComplete(OperationFuture<?> future) throws Exception {
      latch.countDown();
    }
  });
}
latch.await();

您创建一个CountDownLatch,初始化为您设置的文档数量,然后注册一个在每个集合完成时调用的侦听器(但请注意这些集合仍然是异步的)。最后,您可以在锁存器上调用await()以确保所有设置操作都已完成,然后再继续。

在Couchbase Java SDK开发人员指南的Understanding and Using Asynchronous Operations部分中更详细地描述了此方法,如果您使用的是Java 8,则会使用更紧凑的语法。