常规体系结构:我有一个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
答案 0 :(得分:1)
我不知道所有详细信息,但是我确实知道Spring Data初始化了用于访问Couchbase的库,而这种存储方式不会故意阻止其余的加载。我猜想这可能与初始超时有关,因为第一个请求可能会在一次处理大量事件的同时通过。
一个选项,是否有一种方法可以在为常规请求提供服务之前针对集群完成bucket.ping()
?此功能旨在进行各种运行状况检查,并确保已建立所有连接等。这可以在初始化或使用执行器时完成。