带有Guava缓存+ Spring Data + Couchbase索引文档的TImoutexception

时间:2019-01-20 16:03:53

标签: spring-data guava couchbase spring-data-couchbase

常规体系结构:我有一个Guava Cache类,该类应保存存储在Couchbase中的某些数据的结果。

通过Spring Data访问文档,并且在请求的文档上有一个索引,因此它返回的速度非常快,通常在几毫秒内。

问题:在Spring Boot应用程序重新启动后的第一次,对Spring Data存储库的访问权限为TimoutException。然而,它可以在第二个请求上按预期工作,此后直到下一次重新启动应用程序。

缓存类:

private final CatsRepository catsRepository;
private LoadingCache<String, Map<String, Integer>> catsAsMapCache;

@PostConstruct
public void init(){
    catsAsMapCache = CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .build(
                    new CacheLoader<String, Map<String, Integer>>(){
                        public Map<String, Integer> load(String key){
                            Cat cat = catsRepository.findFirstByCatId(key);
                            // do some cool stuff here and return a map
                        }
                    }
            );
}

第一次调用findFirstByCatId(...)时,它将始终得到Timeoutexception。但是从第二次通话开始,此后效果很好。

例外:

com.google.common.util.concurrent.UncheckedExecutionException: org.springframework.dao.QueryTimeoutException: java.util.concurrent.TimeoutException

1 个答案:

答案 0 :(得分:1)

我不知道所有详细信息,但是我确实知道Spring Data初始化了用于访问Couchbase的库,而这种存储方式不会故意阻止其余的加载。我猜想这可能与初始超时有关,因为第一个请求可能会在一次处理大量事件的同时通过。

一个选项,是否有一种方法可以在为常规请求提供服务之前针对集群完成bucket.ping()?此功能旨在进行各种运行状况检查,并确保已建立所有连接等。这可以在初始化或使用执行器时完成。