签入版本
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
```
|
||||
方法调用
|
||||
↓
|
||||
@Before (前置通知) - 数据源验证和准备
|
||||
↓
|
||||
@Around (环绕通知开始) - 设置数据源、记录开始时间
|
||||
↓
|
||||
目标方法执行
|
||||
↓
|
||||
├─ 成功 → @AfterReturning (返回通知) - 记录成功信息
|
||||
↓
|
||||
└─ 失败 → @AfterThrowing (异常通知) - 异常处理
|
||||
↓
|
||||
@Around (环绕通知结束) - 恢复数据源、记录执行时间
|
||||
↓
|
||||
@After (后置通知) - 最终清理和安全检查
|
||||
↓
|
||||
方法返回
|
||||
```
|
||||
|
||||
```angular2html
|
||||
/**
|
||||
* 数据源切面使用示例和最佳实践
|
||||
*
|
||||
* 示例1: 方法级别注解(推荐)
|
||||
* {@code
|
||||
* @Service
|
||||
* public class UserService {
|
||||
*
|
||||
* // 写操作使用主库
|
||||
* @DataSource(DataSourceType.MASTER)
|
||||
* public void createUser(User user) {
|
||||
* userMapper.insert(user);
|
||||
* }
|
||||
*
|
||||
* // 读操作使用从库
|
||||
* @DataSource(DataSourceType.SLAVE1)
|
||||
* public User getUserById(Long id) {
|
||||
* return userMapper.selectById(id);
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* 示例2: 类级别注解
|
||||
* {@code
|
||||
* // 该服务类所有方法默认使用从库
|
||||
* @Service
|
||||
* @DataSource(DataSourceType.SLAVE1)
|
||||
* public class QueryService {
|
||||
*
|
||||
* // 自动使用SLAVE1数据源
|
||||
* public List<User> getAllUsers() {
|
||||
* return userMapper.selectList(null);
|
||||
* }
|
||||
*
|
||||
* // 方法级别注解覆盖类级别注解
|
||||
* @DataSource(DataSourceType.MASTER)
|
||||
* public void updateUser(User user) {
|
||||
* userMapper.updateById(user);
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* 最佳实践:
|
||||
* 1. 读写分离:写操作用MASTER,读操作用SLAVE
|
||||
* 2. 事务一致性:在@Transactional方法中谨慎切换数据源
|
||||
* 3. 性能考虑:避免在循环中频繁切换数据源
|
||||
* 4. 异常处理:确保业务异常不会影响数据源恢复
|
||||
* 5. 测试验证:多数据源环境下充分测试事务一致性
|
||||
*
|
||||
* 注意事项:
|
||||
* 1. 确保@DataSource注解的方法在Spring代理范围内(同类调用不生效)
|
||||
* 2. 事务注解@Transactional应该在数据源切换之后执行
|
||||
* 3. 避免在异步方法中使用数据源切换(线程切换会导致ThreadLocal失效)
|
||||
* 4. 微服务环境下考虑分布式事务的一致性
|
||||
*/
|
||||
```
|
||||
Reference in New Issue
Block a user