【问题标题】:spring-data-couchbase throws DocumentDoesNotExistException for non-existent documentsspring-data-couchbase 为不存在的文档抛出 DocumentDoesNotExistException
【发布时间】:2016-07-26 12:21:20
【问题描述】:

我将spring-data-couchbase 2.1.2spring-boot 1.4.0.RC1couchbase-spring-cache 一起使用

禁用缓存时它可以正常工作,因为它返回 NULL 对象启用缓存并尝试在存储桶中查找不存在的文档时会引发异常:

com.couchbase.client.java.error.DocumentDoesNotExistException: null
    at com.couchbase.client.java.CouchbaseAsyncBucket$22.call(CouchbaseAsyncBucket.java:684) ~[java-client-2.2.8.jar:na]
    at com.couchbase.client.java.CouchbaseAsyncBucket$22.call(CouchbaseAsyncBucket.java:671) ~[java-client-2.2.8.jar:na]
    at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:54) ~[rxjava-1.0.17.jar:1.0.17]
    at rx.observers.Subscribers$5.onNext(Subscribers.java:234) ~[rxjava-1.0.17.jar:1.0.17]
    at rx.subjects.SubjectSubscriptionManager$SubjectObserver.onNext(SubjectSubscriptionManager.java:223) ~[rxjava-1.0.17.jar:1.0.17]
    at rx.subjects.AsyncSubject.onCompleted(AsyncSubject.java:101) ~[rxjava-1.0.17.jar:1.0.17]
    at com.couchbase.client.core.endpoint.AbstractGenericHandler.completeResponse(AbstractGenericHandler.java:354) ~[core-io-1.2.9.jar:na]
    at com.couchbase.client.core.endpoint.AbstractGenericHandler.access$000(AbstractGenericHandler.java:72) ~[core-io-1.2.9.jar:na]
    at com.couchbase.client.core.endpoint.AbstractGenericHandler$1.call(AbstractGenericHandler.java:372) ~[core-io-1.2.9.jar:na]
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) ~[rxjava-1.0.17.jar:1.0.17]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[na:1.7.0_80]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) ~[na:1.7.0_80]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) ~[na:1.7.0_80]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) ~[na:1.7.0_80]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_80]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_80]
    at java.lang.Thread.run(Thread.java:745) ~[na:1.7.0_80]
Caused by: rx.exceptions.OnErrorThrowable$OnNextValue: OnError while emitting onNext value: com.couchbase.client.core.message.kv.RemoveResponse.class
    at rx.exceptions.OnErrorThrowable.addValueAsLastCause(OnErrorThrowable.java:109) ~[rxjava-1.0.17.jar:1.0.17]
    at rx.exceptions.Exceptions.throwOrReport(Exceptions.java:188) ~[rxjava-1.0.17.jar:1.0.17]
    at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:56) ~[rxjava-1.0.17.jar:1.0.17]
    ... 14 common frames omitted

是因为AsyncBucket吗?是否可以禁用 AsyncBucket?

源码https://github.com/maverickmicky/spring-couchbase-cache

【问题讨论】:

  • 你能分享一些代码吗?你确定它在加载文档时发生(即即使只使用简单的@Cacheable也会发生)?
  • 我不认为是因为AsyncBucket,因为它是Couchbase SDK的基础,所以不能禁用它
  • 添加源代码,你需要在本地运行couchbase,存储桶名称为'player'

标签: java spring spring-boot spring-cache spring-data-couchbase


【解决方案1】:

这确实是一个问题...一旦对不在缓存中的键进行驱逐尝试,就会抛出异常:(

我为此创建了an issue(有变通方法)。

编辑:要解决此问题,您应该能够声明一个 CacheErrorHandler,它具有一个简单地捕获 DocumentDoesNotExistExceptionhandleCacheEvictError 方法。 请参阅有关配置缓存抽象hereCachingConfigurer javadoc 的文档部分。

【讨论】:

  • 在 Spring Boot 1.4 中,您对 Database 类所做的很多事情都是多余的,可以自动配置。相反,您只需要 application.property 中的正确条目 + 扩展 CachingConfigurerSupport 并提供 CacheErrorHandler 实现的 @Configuration @EnableCaching 类。
  • 好的。但我面临的问题是在获取过程中。当我在不存在的文档上调用“findOne”时,它会引发异常。任何自动配置示例?
  • 我在 git 中看到了你的提交。我将尝试缓存处理程序。是否可以从环境变量中获取这些属性?我在 docker 中部署它,couchbase 参数是通过 entrypoint.sh 配置的
  • 啊,我明白为什么了:你调用了一个 @Cacheable 注释方法,它在从规范源获取数据后更新缓存。所以它最终会执行put(null),而CouchbaseCache 会将其解释为驱逐(这对我来说可能是一个糟糕的设计决定)。您可以在@Cacheable 上使用unless = "#result == null" 来解决这个问题
【解决方案2】:

我遇到了同样的异常,用例是我正在缓存返回 null 的资源,例如:

@Override
@Cacheable(value = "EMPLOYEE_", key = "#id")
public Employee getEmployee(int id) {
    return null;
}

并使用从 Spring 3.2 开始提供的 @Cacheableunless 属性对其进行了修复,如下所示:

@Override
@Cacheable(value = "EMPLOYEE_", key = "#id", unless = "#result == null")
public Employee getEmployee(int id) {
    return null;
}

还写了一篇文章,描述了我的问题并解决了同样的问题 - Fixing com.couchbase.client.java.error.DocumentDoesNotExistException – Couchbase

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2021-09-17
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多