springboot couchbase每20获取所有文档

时间:2019-07-18 06:09:44

标签: spring spring-boot couchbase n1ql

我想制作API,该API可以从沙发床获取所有数据。

public List<JsonObject> getAllDocumentsCB() {
        List<JsonObject> result = new ArrayList<>();
        // paging 해서 20 개 까지 가져와야함
        N1qlQueryResult queryResult;
        N1qlQuery query = N1qlQuery.simple("SELECT meta().id, * FROM `ATLAS-DEV`");
        queryResult = couchbaseTemplate.queryN1QL(query);
        for (N1qlQueryRow queryRow: queryResult) {
//            System.out.println(queryRow.value());
            result.add(queryRow.value());
        }

        return result;
    }

它当然会返回

org.springframework.dao.QueryTimeoutException
error
org.springframework.dao.QueryTimeoutException: java.util.concurrent.TimeoutException; nested exception is java.lang.RuntimeException: java.util.concurrent.TimeoutException

这是我的超时选项

spring.couchbase.env.timeouts.connect=10000

我将如何更改以每20个为单位获取所有数据?

1 个答案:

答案 0 :(得分:1)

根据Spring参考文档,

“在查询超时上引发的异常。这可能有不同的原因,具体取决于所使用的数据库API,但很可能是在数据库中断或停止查询处理之前引发的可以通过捕获本地数据库异常的用户代码或异常转换来引发此异常。”

根本原因-Spring数据方面:

当查询执行时间超过查询超时值时,会发生这种情况。当发生数据库查询时,相关的Spring Data客户端应用程序(例如:Spring Data Couchbase)将正确映射这种类型的异常。

注意:增加底层spring数据客户端的查询超时配置不是解决此问题的方法,除非将其设置为非常低的值。如果没有特定原因,最好使用默认值。

解决方案:

  1. 浏览Spring Data客户端应用程序客户端引用,并确保将其设置为适当的默认值。如上例所示,Couchbase设置为75000ms,这比要求的要多,但最好保持原样。

  2. 调查并隔离导致查询超时的关联查询。在上面的示例中,它应该是“ findOne”查询。

  3. 手动创建一个类似的查询,然后在查询运行器环境中运行,以检查查询是否实际上消耗了意外的完成时间。

  4. 如果以上步骤显示了延迟,则问题出在数据库端,可能是您必须添加索引以加快查询执行速度。

  5. 如果上述第3步执行得足够快,则可能是您的应用程序中错误地使用了上述功能。您可能在循环中多次执行示例。

诸如添加索引之类的数据库方面的优化是特定于数据库的,应按照文档进行正确的处理。

参考文献:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/dao/QueryTimeoutException.html

https://developer.couchbase.com/guides-and-references

编辑

使用where子句:

如果数据集很大,则需要使用索引以确保查询性能。如果在where子句中使用的属性上创建索引,则应该看到更好的查询性能。例如,如果查询为:

SELECT count(*) FROM myBucket WHERE foo > 20

然后创建一个索引:

CREATE INDEX bidx1 ON myBucket(foo)

应该提供更具响应性的查询。