在我的春季启动应用程序中,我异步进行了几次数据库调用:
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();
}
基本上问题在于尽管将我的服务层方法标记为事务&amp; read read设置为true,它实际上并没有将ThreadLocal状态传递给RxJava产生的新线程,导致连接进入我的主数据库实例而不是只读副本。
我们目前在ContextHandlers
中使用已配置的ContextAwareSchedulerHook
和App.java
,但我需要做什么才能使RxJava创建的新线程继承所需的ThreadLocal状态在定义的交易中管理它们吗?
答案 0 :(得分:0)
将您的dbQueryMethod
标记为@Transactional(readOnly=true)
,并确保通过Spring自动连接代理(不是直接来自同一个类)调用它。然后io
线程将启动新事务,这将是只读的。