Spring Data Repository 将使用哪个 TransactionManager?

问题描述

我们在 AWS 中有一个带有异步只读副本的 MysqL 数据库,因此在我们的 Spring 项目中,我们定义了两个数据源,每个数据源都有自己的 LocalContainerEntityManagerfactorybeanPlatformTransactionManager,我们称它们为 READER 和 WRITER。

接下来我们有一个

注释的配置bean
@EnableJpaRepositories(
        entityManagerFactoryRef = READER_ENTITY_MANAGER_FACTORY,basePackages = {
                "reader.repositories.package"
        },transactionManagerRef = READER_TRANSACTION_MANAGER
)

和另一个

@EnableJpaRepositories(
        entityManagerFactoryRef = WRITER_ENTITY_MANAGER_FACTORY,basePackages = {
                "writer.repositories.package"
        },transactionManagerRef = WRITER_TRANSACTION_MANAGER
)

那么问题是以下情况会使用哪个事务管理器?

reader.repositories.package 中有一个存储库,它使用 Stream 作为返回值,这要求它在 @Transactional 方法中运行以在光标移动到查询结果上时保持连接打开:

package reader.repositories.package;

public interface SomeEntityReaderRepository extends JpaRepository<SomeEntity,Long> {

    Stream<SomeEntity> findByUserIdOrderByTimeAdded(int userId);
}

虽然此存储库位于读取器存储库包内且在其 @EnableJpaRepositories 中使用 READER 事务管理器,但它是从使用 WRITER 事务管理器的服务 bean 方法调用的:

    @Transactional(WRITER_TRANSACTION_MANAGER)
    @Override
    public void someMethod(int userId) {
        ...
        try (Stream<EntityT> stream 
 = someEntityReaderRepository.findByUserIdOrderByTimeAdded(userId)) {
            var results = stream.map(...)
               .collect(Collectors.toList());
        }
        ...
    }

Spring 不会抱怨封闭事务,因为调用是用 @Transactional 注释的,但是它使用 WRITER 事务管理器,因此在使用 READER 事务管理器创建存储库时使用不同的数据源。如果它使用 READER 数据源,即使事务是针对 WRITER 数据源的,连接是否会按照流的要求保持打开状态?目前它给出了正确的结果,但是我需要找出它最终使用的是哪个数据源,是否可以以这种方式使用,或者我们是否需要为编写器存储库复制相同的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)