couchbase Java JDK n1ql需要很长时间才能获得结果,但n1ql在API或查询平台上运行得非常快

couchbase Java JDK n1ql需要很长时间才能获得结果,但n1ql在API或查询平台上运行得非常快,couchbase,vert.x,n1ql,Couchbase,Vert.x,N1ql,我有一些N1QL sql语句和设置正确的索引。 N1QL语句平均需要10-15毫秒,但我有一个Java SDK,它调用相同的SQL,执行几乎需要一两秒钟。 下面是我如何尝试做到这一点的完整代码。 我正在使用vertxapi。 我做了一些跟踪什么陈述需要更多的时间。大部分时间(约90%-95%)由 bucket.async().query(N1qlQuery.simple(selectStatement))如下 我不知道我做错了什么 private CouchbaseCluster clu

我有一些N1QL sql语句和设置正确的索引。 N1QL语句平均需要10-15毫秒,但我有一个Java SDK,它调用相同的SQL,执行几乎需要一两秒钟。 下面是我如何尝试做到这一点的完整代码。 我正在使用vertxapi。 我做了一些跟踪什么陈述需要更多的时间。大部分时间(约90%-95%)由

bucket.async().query(N1qlQuery.simple(selectStatement))如下

我不知道我做错了什么

    private CouchbaseCluster cluster;
    private volatile Bucket bucket;

JsonObject config = context.config();
        CouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder()
                .connectTimeout(30000) //10000ms = 10s, default is 5s
                .build() ; 

        JsonArray seedNodeArray = config.getJsonArray("couchbase.seedNodes", config.getJsonArray("couchbase.servers"));

        // convert to a List
        List seedNodes = new ArrayList<>(seedNodeArray.size());
        for (Object seedNode : seedNodeArray) {
            seedNodes.add(seedNode);
        }
        // use that to bootstrap the Cluster
        cluster = CouchbaseCluster.create(env ,seedNodes);

                JsonObject config = vertx.getOrCreateContext().config();

        try {
            bucket = cluster
                    .authenticate(config.getString("couchbase.username"),
                            new String(Base64.getDecoder().decode(config.getString("couchbase.password"))))
                    .openBucket(config.getString("couchbase.bucket"));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            startFuture.fail(e.getMessage());
        }


        bucket.async().query(N1qlQuery.simple(selectStatement))
                    .retryWhen(RetryBuilder.anyOf(BackpressureException.class)
                            .delay(Delay.exponential(TimeUnit.MILLISECONDS, 5000)).max(5).build())
                    .flatMap(AsyncN1qlQueryResult::rows).map(row -> {
                        return row.value().toString();
                    }).timeout(10, TimeUnit.SECONDS).subscribe(new Subscriber<String>() {

                        JsonArray jarray = new JsonArray();

                        JsonObject jobj = new JsonObject();

                        public void onCompleted() {
                            // Extra logger for debug
                            LOGGER.info("Sending final response ");

                            if (jarray.size() > 0) {
                                Response = QueryResponse.sendResponse(rc, 200, "SUCCESS", "Results Found", jarray);
                                Response.setHandler(resu -> {
                                    if (resu.succeeded()) {
                                        Response.complete();
                                    } else {
                                        Response.fail(resu.cause());
                                    }
                                });

                            } else {
                                Response = QueryResponse.sendResponse(rc, 404, "FAILURE",
                                        "No results found for SQL Statement :", selectStatement.toString());
                                Response.setHandler(resu -> {
                                    if (resu.succeeded()) {
                                        Response.complete();
                                    } else {
                                        Response.fail(resu.cause());
                                    }
                                });

                            }

                        }

                        @Override
                        public void onError(Throwable exp) {

                            LOGGER.info("Error retriving the query docs :" + exp);

                            Response = QueryResponse.sendResponse(rc, 500, "FAILURE",
                                    "Some thing went wrong exequting the request: ",
                                    new JsonArray().add(new JsonObject().put("request", selectStatement.toString()))
                                            .add(new JsonObject().put("response", exp)));
                            Response.setHandler(resu -> {
                                if (resu.succeeded()) {
                                    Response.complete();
                                } else {
                                    Response.fail(resu.cause());
                                }
                            });

                        }

                        @Override
                        public void onNext(String NextJson) {
                            // Add the Json objects from couchbase into the Json Array
                            LOGGER.info("received a doc: ");
                            JsonObject jobj = new JsonObject(NextJson);
                            jarray.add(jobj);

                        }

                    });
专用CouchbaseCluster集群;
私有易失性桶;
JsonObject config=context.config();
CouchbaseEnvironment env=DefaultCouchbaseEnvironment.builder()
.connectTimeout(30000)//10000ms=10s,默认为5s
.build();
JsonArray-seednoderray=config.getJsonArray(“couchbase.seedNodes”,config.getJsonArray(“couchbase.servers”);
//转换为列表
List seedNodes=newarraylist(seednoderray.size());
用于(对象种子节点:种子节点阵列){
添加(seedNode);
}
//使用它来引导集群
cluster=CouchbaseCluster.create(env,seedNodes);
JsonObject config=vertx.getOrCreateContext().config();
试一试{
bucket=集群
.authenticate(config.getString(“couchbase.username”),
新字符串(Base64.getDecoder().decode(config.getString(“couchbase.password”))
.openBucket(config.getString(“couchbase.bucket”);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
startFuture.fail(例如getMessage());
}
bucket.async().query(N1qlQuery.simple(selectStatement))
.retryWhen(RetryBuilder.anyOf(backpressureeexception.class)
.delay(delay.index(TimeUnit.millides,5000)).max(5.build())
.flatMap(AsyncN1qlQueryResult::rows).map(row->{
返回row.value().toString();
}).timeout(10,TimeUnit.SECONDS).subscribe(新订户(){
JsonArray jarray=新的JsonArray();
JsonObject jobj=新的JsonObject();
未完成的公共无效(){
//用于调试的额外记录器
LOGGER.info(“发送最终响应”);
如果(jarray.size()>0){
Response=QueryResponse.sendsponse(rc,200,“成功”,“找到结果”,jarray);
Response.setHandler(resu->{
如果(resu.successed()){
响应。完成();
}否则{
响应失败(结果原因());
}
});
}否则{
Response=QueryResponse.sendResponse(rc,404,“失败”,
找不到SQL语句的结果:,selectStatement.toString();
Response.setHandler(resu->{
如果(resu.successed()){
响应。完成();
}否则{
响应失败(结果原因());
}
});
}
}
@凌驾
公共作废登记员(可丢弃经验){
LOGGER.info(“检索查询文档时出错:“+exp”);
Response=QueryResponse.sendResponse(rc,500,“失败”,
“有些事情在解释请求时出错了:”,
新建JsonArray().add(新建JsonObject().put(“请求”,selectStatement.toString()))
.add(新的JsonObject().put(“response”,exp));
Response.setHandler(resu->{
如果(resu.successed()){
响应。完成();
}否则{
响应失败(结果原因());
}
});
}
@凌驾
public void onNext(字符串NextJson){
//将couchbase中的Json对象添加到Json数组中
LOGGER.info(“收到文件:”);
JsonObject jobj=新的JsonObject(NextJson);
jarray.add(jobj);
}
});
能否启用RTO()并发布结果?能否启用RTO()并发布结果?