У меня есть несколько N1QL SQL операторов и индексы, которые установлены правильно.Операторы N1QL в среднем занимают около 10 -15 мс, но у меня есть Java SDK, который вызывает тот же SQL, выполнение которого занимает почти секунду или две.Ниже приведен полный код того, как я пытаюсь это сделать.Я использую Vertx API.Я проследил, какие утверждения занимают больше времени.Большая часть времени (около 90% - 95%) занята запросом
bucket.async (). (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);
}
});