spring数据存储库将使用哪个transactionmanager?

w7t8yxp5  于 2021-07-23  发布在  Java
关注(0)|答案(0)|浏览(272)

我们在aws中有一个mysql数据库,其中包含异步读取副本,因此在spring项目中,我们定义了两个数据源,每个数据源都有自己的副本 LocalContainerEntityManagerFactoryBean 以及 PlatformTransactionManager ,让我们称他们为读者和作家。
下一步,我们将为每个配置提供一个带注解的配置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 它使用流作为返回值,要求它在 @Transactional 方法在光标移动到查询结果上时保持连接打开:

package reader.repositories.package;

public interface SomeEntityReaderRepository extends JpaRepository<SomeEntity, Long> {

    Stream<SomeEntity> findByUserIdOrderByTimeAdded(int userId);
}

而此存储库位于reader repositories包及其 @EnableJpaRepositories 使用读卡器事务管理器,它是使用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数据源,连接是否会按照流的要求保持打开状态?目前它给出了正确的结果,但是我需要找出它最终使用的是哪个数据源,以这种方式使用它是否可以,或者我们是否需要为writer repository复制相同的方法?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题