Spring Boot 中通过事务管理配置多个数据源

处理多个数据源和事务的必要性

在企业级应用程序中,经常需要同时与多个数据库进行交互。这可能涉及跨不同数据库管理关键数据,同时确保这些来源之间事务的完整性和一致性。

在 Spring Boot 中配置多数据源和事务管理

步骤 1:定义数据源属性

在 application.properties 或 application.yml 中,指定两个数据源的配置:

# 主数据库配置
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primarydb
spring.datasource.primary.username=dbuser1
spring.datasource.primary.password=dbpassword1
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

# 辅助数据库配置
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
spring.datasource.secondary.username=dbuser2
spring.datasource.secondary.password=dbpassword2
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

第 2 步:配置数据源 Bean

让我们将这些数据源配置为 beans 并启用事务管理:

@Configuration
@EnableTransactionManagement
public class DataSourceConfig {

    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
        return new DataSourceTransactionManager(primaryDataSource);
    }

    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        return new DataSourceTransactionManager(secondaryDataSource);
    }
}

在 Spring Boot 应用程序中使用事务操作

现在,让我们在与这些数据源交互时使用事务功能:

@Service
public class DataService {

    private final JdbcTemplate primaryJdbcTemplate;
    private final JdbcTemplate secondaryJdbcTemplate;

    public DataService(@Qualifier("primaryJdbcTemplate") JdbcTemplate primaryJdbcTemplate,
                       @Qualifier("secondaryJdbcTemplate") JdbcTemplate secondaryJdbcTemplate) {
        this.primaryJdbcTemplate = primaryJdbcTemplate;
        this.secondaryJdbcTemplate = secondaryJdbcTemplate;
    }

    @Transactional("transactionManager")
    public void performTransactionOnPrimaryDatabase() {
        // 使用primaryJdbcTemplate执行事务性操作
        primaryJdbcTemplate.update("INSERT INTO table_in_primary VALUES (?, ?)", 1, "Data");
    }

    @Transactional("secondaryTransactionManager")
    public void performTransactionOnSecondaryDatabase() {
        // 使用secondary JdbcTemplate执行事务性操作
        secondaryJdbcTemplate.update("INSERT INTO table_in_secondary VALUES (?, ?)", 2, "More Data");
    }
}

凭借 Spring Boot 对多个数据源的完美处理及其强大的事务管理功能,您已经解锁了跨不同数据库无缝执行事务的能力。这使开发人员能够构建弹性且可扩展的应用程序,确保跨不同数据源操作时的数据完整性。

© 版权声明
THE END
喜欢就支持一下吧
点赞0打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容