Couchbase中的多个插入失败

Couchbase中的多个插入失败,couchbase,nosql,Couchbase,Nosql,Couchbase新手问题: 我正试图在couchbase中插入100万条记录,但我看到大约有50万条记录被插入(管理控制台显示517365条为项目计数)。 另外,在管理GUI中,我只能看到1000条记录(10页,每条100条记录) 我想知道其余的记录在哪里消失了 1) 有人能帮我吗 2) 我应该查看哪个日志文件来查找插入失败错误 我怀疑Couchbase有一个内部队列。一旦它满了,进一步的请求就会被丢弃。如果是,那么如何配置队列大小 PS:我试着查看日志C:\ProgramFiles\Couc

Couchbase新手问题:

我正试图在couchbase中插入100万条记录,但我看到大约有50万条记录被插入(管理控制台显示517365条为项目计数)。 另外,在管理GUI中,我只能看到1000条记录(10页,每条100条记录)

我想知道其余的记录在哪里消失了

1) 有人能帮我吗

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

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

PS:我试着查看日志C:\ProgramFiles\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 + "");
        }
    }
}
公共类测试{
公共静态void main(字符串[]args){
ArrayList节点=新的ArrayList();
字符串cbUrl=”http://127.0.0.1:8091/pools";
字符串dbName=“deafult”;
CouchbaseClient=null;
试一试{
nodes.add(URI.create(cbUrl));
client=newcouchbaseclient(节点,dbName,“”);
插入记录(客户);
系统输出打印(“测试结束”);
}捕获(例外e){
e、 printStackTrace();
}最后{
//client.shutdown();
}
}
公共静态void insertRecords(CouchbaseClient客户端)引发异常{
int num=1000000;

对于(int n=1;nCouchbase Java SDK中的set操作是异步的。这意味着一旦调用返回,就不能保证您已经将操作发送到Couchbase,因为它可能还没有写入网络缓冲区。为了确保操作已经完成,您需要调用get()函数对set()API返回的对象(未来对象)执行

换言之,替换此行:

client.set(n + "", 0, n + "");
关于这一点:

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

要扩展@mikewied的答案,检查所有1000000个集合操作是否已完成,而不必显式地调用每个集合上的
.get()
(从而将调用从异步转换为同步),您需要向每个集合添加一个侦听器,跟踪您已完成的操作数

在发布的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();
最终倒计时闩锁=新倒计时闩锁(100);
对于(int i=0;i<100;i++){
OperationFuture=client.set(“key-”+i,“value”);
future.addListener(新操作CompletionListener(){
@凌驾
public void onComplete(OperationFuture)引发异常{
倒计时();
}
});
}
satch.wait();
创建一个
CountDownLatch
,初始化为要设置的文档数(),然后注册一个监听器,在每个集合完成时调用该监听器(注意集合仍然是异步的)。最后,在闩锁上调用
wait()
,以确保所有集合操作都已完成,然后继续


《Couchbase Java SDK开发人员指南》一节对这种方法进行了更详细的描述,如果您使用的是Java 8,还提供了更简洁的语法。

您可以记录操作的状态吗?例如
client.set('foo','bar')。getStatus()
请注意,执行@avsej在这里提到的操作也会导致应用程序正常工作,因为getStatus()调用将等待操作完成,以获取该操作的返回代码。我尝试了client.set('foo','bar').getStatus()。但是我得到了{OperationStatus success=false:Temporary failure}作为许多记录的状态。我如何配置Couchbase缓冲区大小?我想这应该可以解决问题。这不会使调用同步吗?我想Couchbase使用一些队列。最好知道如何配置它或检查其默认大小。哦…因为这是一个未来,调用将是异步的,但会有sti对于每个set调用,都将是一个不必要的get调用。有没有办法避免它?在shutdown()API中,您应该能够将“wait for queues”值设置为true。否则,您将需要调用get()函数,以确保操作已完成。您还可以做的一件事是将所有未来对象放入一个列表中,然后定期对所有对象调用get()。在批量加载代码中,我编写了I queue 1000 Futures,然后调用get()在所有这些上重复,直到加载所有数据。让我回到问题上来,我是否可以避免进行不必要的“get”调用?此外,我如何配置Couchbase使用的内部缓冲区大小(它将让我知道一次可以进行多少个insert查询)?您能帮我回答这两个问题吗?请注意,作为onComplete函数的一部分,检查操作是否成功仍然很重要,因为操作可能已“完成”,并带有错误代码。例如,您可能需要检查:future.getStatus().issucess()