gpt4 book ai didi

java - Spring - 如何使用两个数据源正确配置@Transactional?

转载 作者:行者123 更新时间:2023-12-02 01:28:22 25 4
gpt4 key购买 nike

我有两个 spring 数据源配置,如下所示:

@EnableJpaRepositories(basePackages = {"XXXXXX",
"XXXXXX"}, entityManagerFactoryRef = "postgreSqlEM", transactionManagerRef = "postgreSqlTM")
@EnableTransactionManagement
@Configuration
public class PostgreSqlDataSourceConfig {

@Primary
@Bean
@ConfigurationProperties("spring.postgresql.hikari")
public HikariConfig postgreSqlHikariConfig() {
return new HikariConfig();
}

@Primary
@Bean
public DataSource postgreSqlDataSource() {
return new HikariDataSource(postgreSqlHikariConfig());
}

@Primary
@Bean("postgreSqlEM")
public LocalContainerEntityManagerFactoryBean postgreSqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder.dataSource(postgreSqlDataSource()).packages("XXXXXX",
"XXXXXX",
"XXXXXX")

.build();
}

@Primary
@Bean("postgreSqlTM")
public JpaTransactionManager postgreSqlTransactionManager(@Qualifier("postgreSqlEM") EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}

@Primary
@Bean
public EntityManager getEntityManager(@Qualifier("postgreSqlEM") EntityManagerFactory emf) {
return emf.createEntityManager();
}
}

这是 @Primary,因此所有没有值配置的 @Transactional 以及所有 EntityManager 注入(inject)都应该指向它。

Spring boot 正常启动,但所有 @Transactional 注解都被忽略。

我收到这样的错误:

javax.persistence.TransactionRequiredException: javax.persistence.Query.executeUpdate requires active transaction

如何正确配置它以便 @Transactional 起作用?

我使用的是 Spring Boot 2.1.5.RELEASE。

最佳答案

首先,每个数据源配置一个 TransactionManager。两个数据源意味着您将有两个 TransactionManager。

这是一个例子:

    @Bean(name = "blamTransactionManager")
@Primary
public PlatformTransactionManager blamTransactionManager(
@Qualifier("blamDataSourcePool") final DataSource blamDataSource)
{
return new DataSourceTransactionManager(
blamDataSource);
}

第二,使用上面创建的两个事务管理器配置 ChainedTransactionManager

这是一个例子:

    @Bean(name = "chainedTransactionManager")
public ChainedTransactionManager transactionManager(
@Qualifier("blamTransactionManager") final PlatformTransactionManager blamTransactionManager,
@Qualifier("kapowTransactionManager") final PlatformTransactionManager kapowTransactionManager)
{
return new ChainedTransactionManager(
blamTransactionManager,
kapowTransactionManager);
}

最后,在事务注释中引用 chainedTransactionManager。

例如:

    @Transactional("chainedTransactionManager")

关于java - Spring - 如何使用两个数据源正确配置@Transactional?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56500323/

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