假设有两个数据源 dataSource1 和 dataSource2,每个数据源对应一个数据库。这里使用 JdbcTemplate 来访问数据库,并通过 @Transactional 注解来管理事务。
配置多数据源
首先,在 application.properties 或 application.yml 中配置两个数据源:
# 第一个数据源配置
spring.datasource1.url=jdbc:mysql://localhost:3306/db1
spring.datasource1.username=username1
spring.datasource1.password=password1
# 其他配置...
# 第二个数据源配置
spring.datasource2.url=jdbc:mysql://localhost:3306/db2
spring.datasource2.username=username2
spring.datasource2.password=password2
# 其他配置...
创建多数据源配置类
@Configuration
public class DataSourceConfig {
@Bean(name = "dataSource1")
@ConfigurationProperties(prefix = "spring.datasource1")
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource2")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
}
配置事务管理器
@Configuration
public class TransactionManagerConfig {
@Primary
@Bean(name = "transactionManager1")
public PlatformTransactionManager transactionManager1(@Qualifier("dataSource1") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "transactionManager2")
public PlatformTransactionManager transactionManager2(@Qualifier("dataSource2") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
使用多数据源和事务管理
@Service
public class MyService {
@Autowired
private JdbcTemplate jdbcTemplate1; // 对应dataSource1
@Autowired
private JdbcTemplate jdbcTemplate2; // 对应dataSource2
@Transactional(transactionManager = "transactionManager1")
public void transactionalOperation() {
// 在这里使用 jdbcTemplate1 操作数据库
}
@Transactional(transactionManager = "transactionManager2")
public void transactionalOperation2() {
// 在这里使用 jdbcTemplate2 操作数据库
}
@Transactional
public void transactionalOperationBoth() {
// 这里同时操作两个数据源
// 可以在这里分别使用 jdbcTemplate1 和 jdbcTemplate2 进行操作
}
}
在上述示例中,使用 @Transactional(transactionManager = "transactionManager1")
*和 @Transactional(transactionManager = "transactionManager2")
标注方法,来指定不同的事务管理器,从而实现对应数据源的事务管理。