gpt4 book ai didi

java - 在 Spring boot Transaction 中以只读方式执行 RxJava observable?

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:12 25 4
gpt4 key购买 nike

在我的 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();
}

基本上,问题在于,尽管将我的服务层方法标记为事务且只读设置为 true,但它实际上并未将 ThreadLocal 状态传递给 RxJava 生成的新线程,导致连接转到我的主数据库实例,而不是只读副本。

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

最佳答案

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

关于java - 在 Spring boot Transaction 中以只读方式执行 RxJava observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com