Spring Boot 双数据源配置
- 第一个数据源配置:
@Configuration @MapperScan(basePackages = "", sqlSessionFactoryRef = "primarySqlSessionFactory") public class PrimaryDataSourceConfig { @Bean(name = "primaryDataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource getPrimaryDataSource() { return new HikariDataSource(); } // ... 其他配置方法 ... @Bean(name = "primaryTransactionManager") @Primary public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
- 第二个数据源配置类与第一个类类似,需要将Bean名称改为不同的名称。
开启事务管理
在主应用程序类上添加注解 @EnableTransactionManagement
,同时确保添加了相关的 JDBC 依赖。
事务问题分析后,这里是事务未生效的原因:
Spring 事务的原理是基于 AOP。
- 异常未正确抛出:应该抛出
RuntimeException
,让事务能够捕获异常进行回滚。 - 方法必须是
public
:被@Transactional
注解修饰的方法必须是public
,以便 Spring 生成代理类。 - 自调用问题:在之前的代码中,
checkOrderService.wechatOrderToDB(localDate)
和checkOrderService.checkOrder(localDate)
是在同一个类中进行的自调用,可能绕过了代理。解决方法是将这两个方法放到另一个类中,并通过该类的方法进行调用。
当前代码示例:
ce.wechatOrderToDB(localDate);
checkOrder
@Service public class WechatService { @Resource private WehcatCheckOrderService checkOrderService; @Transactional(transactionManager = "primaryTransactionManager", propagation = Propagation.REQUIRED) public void performCheckOrder(LocalDate localDate) throws ApiException { // 调用 checkOrderService 方法之前的逻辑 checkOrderService.wechatOrderToDB(localDate); checkOrderService.checkOrder(localDate); // 调用 checkOrderService 方法之后的逻辑 } }
Service.checkOrder(localDate);
// 调用 checkOrderService 方法之后的逻辑
}
}
通过将需要进行事务管理的方法放在另一个类中,并在需要的地方调用该类的方法,可以确保事务生效并避免自调用问题。同时,注意抛出适当的异常类型以触发事务回滚。