在我的spring boot应用程序中,我异步进行了几个数据库调用,如下所示:
public List<Results> doWork() {
List<Observable<Results>> observables = Lists.newArrayList();
observables.add(
Observable.fromCallable(() -> dbQueryMethod(param1)).subscribeOn(Schedulers.io()));
observables.add(
Observable.fromCallable(() -> dbQueryMethod(param2)).subscribeOn(Schedulers.io()));
return Observable.merge(observables)
.toList()
.toBlocking()
.single();
}
@Transactional(readOnly=true)
public List<Results> myServiceMethod() {
doWork();
}
基本上,问题是,尽管将我的服务层方法标记为transaction&readonly设置为true,但实际上并没有将ThreadLocal状态传递给RxJava产生的新线程,从而导致连接转到我的主数据库实例,而不是只读副本。 。
我们当前正在使用配置的
ContextHandlers
和ContextAwareSchedulerHook
中的App.java
,但是我需要怎么做才能使RxJava创建的新线程将继承在定义的事务中管理它们所需的任何ThreadLocal状态? 最佳答案
用dbQueryMethod
标记@Transactional(readOnly=true)
,并确保您通过Spring自动连线代理(而不是直接来自同一类)调用它。然后io
线程将启动新事务,该事务将是只读的。