在我的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产生的新线程,从而导致连接转到我的主数据库实例,而不是只读副本。 。

我们当前正在使用配置的ContextHandlersContextAwareSchedulerHook中的App.java,但是我需要怎么做才能使RxJava创建的新线程将继承在定义的事务中管理它们所需的任何ThreadLocal状态?

最佳答案

dbQueryMethod标记@Transactional(readOnly=true),并确保您通过Spring自动连线代理(而不是直接来自同一类)调用它。然后io线程将启动新事务,该事务将是只读的。

09-05 01:12