我们在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复制相同的方法?
暂无答案!
目前还没有任何答案,快来回答吧!