多数据源解决方案——AOP实现多数据源动态切换

1. 场景描述

在springboot开发中,可能遇见操作多个数据库的情形。一种解决方案就是:配置动态数据源,利用AOP,注解实现数据源的自由切换

比如类似使用

@TargetDataSource(DataSourceEnum.MASTER)
public List<SysUserDto> getSysUserInfo() {
   
    return master.selectAll();
}

@TargetDataSource(DataSourceEnum.SLAVE)
public List<CompanyDto> getCompanyInfo() {
   
    return slave.selectAll();
}

利用注解@TargetDataSource,在调用不同mapper的selectAll方法时,一个使用主数据源,一个使用从属数据源分别进行查找

2. 项目依赖

<properties>
        <java.version>8</java.version>
        <mybatis.version>2.2.0</mybatis.version>
        <mysql.version>8.0.25</mysql.version>
        <sqlserver.version>9.4.0.jre8</sqlserver.version>
        <druid.version>1.2.6</druid.version>
        <guava.version>30.1.1-jre</guava.version>
        <aop.version>2.5.8</aop.version>
        <apache-commons.version>3.12.0</apache-commons.version>
    </properties>

3. 场景实现

  1. 配置数据源
public class DruidDataSourceConfig 
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP(面向切面编程)是Spring框架中的一个组件,它允许您以一种声明性的方式来处理横切关注点(如事务管理,日志记录等)。 通过使用AOP,可以将这些关注点从应用程序的主体中分离出来,从而实现代码的复用和灵活性。 在使用Spring框架中实现数据切换时,可以使用自定义注解的形式来实现。首先,首先在应用程序的主体中定义两个数据。 然后,可以定义一个自定义注解,用于标识哪些方法应该使用哪个数据。例如,使用“@Primary”注解标记主要数据,使用“@Secondary”注解标记辅助数据。 然后,在Spring配置中定义一个AOP切面,该切面使用上述自定义注解来切换数据。下面是这种方法的一个示例: ```java @Aspect @Component public class DataSourceAspect { @Around("@annotation(Primary)") public Object primaryDataSource(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 切换到主要数据 DynamicDataSourceContextHolder.setDataSource(DynamicDataSourceContextHolder.DATA_SOURCE_PRIMARY); try { return proceedingJoinPoint.proceed(); } finally { // 切换回默认数据 DynamicDataSourceContextHolder.clearDataSource(); } } @Around("@annotation(Secondary)") public Object secondaryDataSource(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 切换到辅助数据 DynamicDataSourceContextHolder.setDataSource(DynamicDataSourceContextHolder.DATA_SOURCE_SECONDARY); try { return proceedingJoinPoint.proceed(); } finally { // 切换回默认数据 DynamicDataSourceContextHolder.clearDataSource(); } } } ``` 在上面的代码中,我们可以看到“@Around”注解被用于定义一个环绕通知,该通知基于使用“@Primary”或“@Secondary”注解的方法进行拦截。 在方法执行之前,我们使用“DynamicDataSourceContextHolder”来将数据设置为主要或辅助数据。 在方法执行完成之后,我们将数据切换回默认数据。 最后,我们可以将“@Primary”和“@Secondary”注解带到相应的方法上,以切换不同的数据,例如: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override @Primary public User getUserById(long id) { return userDao.getUserById(id); } @Override @Secondary public List<User> getAllUsers() { return userDao.getAllUsers(); } } ``` 在上面的代码中,我们可以看到“@Primary”注解被用于getUserById()方法,表示这个方法应该从主要数据中读取数据。相反,getAllUsers()方法被标记为“@Secondary”注解,表示这个方法应该从辅助数据中读取数据。 通过这种方式,我们可以很容易地切换应用程序中的不同数据,并且代码的重复率很低。这种方法适用于需要在应用程序的不同部分使用不同数据的多租户应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值