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 + "");
}
}
}
答案 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,则会使用更紧凑的语法。