Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当缓存为空并将值设置为cache from db时,如何进行db调用?_Java_Caching_Rx Java - Fatal编程技术网

Java 当缓存为空并将值设置为cache from db时,如何进行db调用?

Java 当缓存为空并将值设置为cache from db时,如何进行db调用?,java,caching,rx-java,Java,Caching,Rx Java,我有一个缓存和一个数据库。我正在从缓存中获取值。如果缓存中的数据为空(由于过期)。在从缓存中获取数据后,我正在调用数据库。我将把值从数据库设置为缓存 Single<String> get() { return getFromCache().onErrorResumeNext(getFromDatabase()); } Single<String> getFromCache() { // or should I use may be here //retu

我有一个缓存和一个数据库。我正在从缓存中获取值。如果缓存中的数据为空(由于过期)。在从缓存中获取数据后,我正在调用数据库。我将把值从数据库设置为缓存

Single<String> get() {
    return getFromCache().onErrorResumeNext(getFromDatabase());
}

Single<String> getFromCache()  { // or should I use may be here
   //return Single.just("cache");
    return Single.error(new Exception("exception"));
}

Single<String> getFromDatabase() {
    return Single.just("database");
}

Single<String> setDatabase(Single<String> val) {
    return val.map(
            v -> {
                String res = v;
                System.out.println(res);
                return res;
            }
    );
}
singleget(){
返回getFromCache().onErrorResumeNext(getFromDatabase());
}
Single getFromCache(){//或者我应该使用的可能在这里
//返回Single.just(“缓存”);
返回Single.error(新异常(“异常”));
}
单个getFromDatabase(){
返回Single.just(“数据库”);
}
单setDatabase(单val){
返回值映射(
v->{
字符串res=v;
系统输出打印项次(res);
返回res;
}
);
}
在这里,若缓存中的值为空,我可以调用数据库,但我不能调用方法setDatabase

------------我找到了解决这个问题的办法--------------------------- 因为我是rxjava新手。我想知道解决这个问题的最好办法是什么

Single<String> get() {
    Observable<String> cacheObservable = getFromCache().toObservable();
    Observable<String> databaseObservable = getFromDatabase().toObservable();

    Single<String> result = Observable.concat(cacheObservable, databaseObservable).firstOrError();

    databaseObservable.doOnNext(val-> {
        setDatabase(val);
    });
    return result;
}

Maybe<String> getFromCache()  { // or should I use may be here
   //return Maybe.just("cache");
   return Maybe.empty();
}

Single<String> getFromDatabase() {
    return Single.just("database");
}

void setDatabase(String res) {
    System.out.println(res);
}
singleget(){
Observable cacheObservable=getFromCache().toObservable();
Observable databaseObservable=getFromDatabase().toObservable();
单个结果=Observable.concat(cacheObservable,databaseObservable).firstOrError();
databaseObservable.doOnNext(val->{
setDatabase(val);
});
返回结果;
}
可能是getFromCache(){//或者我应该使用它,可能在这里
//可能会返回。只是(“缓存”);
返回Maybe.empty();
}
单个getFromDatabase(){
返回Single.just(“数据库”);
}
void setDatabase(字符串res){
系统输出打印项次(res);
}

您几乎完成了,请在您的用例中使用
开关ifempty

singleget(){
返回getFromCache()
.switchIfEmpty(getFromDatabase().doOnAccess(this::setDatabase));
}