SpringBoot系列 - 多数据源配置
项目中经常会出现需要同时连接两个数据源的情况,这里还是演示基于MyBatis来配置两个数据源,并演示如何切换不同的数据源。
网上的一些例子都写的有点冗余,这里我通过自定义注解+AOP的方式,来简化这种数据源的切换操作。
maven依赖
1 |
|
初始化数据库
这里我们需要创建两个数据库,初始化脚本如下:
1 | # -------------------------------------以下是pos业务库开始------------------------------------------- |
可以看到我创建了两个数据库pos和biz,同时还初始化了用户表,并分别插入两条初始数据。注意用户名数据不相同。
配置文件
接下来修改application.yml配置文件,如下:
1 | ################### 自定义配置 ################### |
解释一下:
这里我添加了一个自定义配置项muti-datasource-open
,用来控制是否开启多数据源支持。这个配置项后面我会用到。
接下来定义MyBatis的配置,最后定义了两个MySQL数据库的连接信息,一个是pos库,一个是biz库。
动态切换数据源
这里通过Spring的AOP技术实现数据源的动态切换。
多数据源的常量类:
1 | public interface DSEnum { |
datasource的上下文,用来存储当前线程的数据源类型:
1 | public class DataSourceContextHolder { |
定义动态数据源,继承AbstractRoutingDataSource
:
1 | public class DynamicDataSource extends AbstractRoutingDataSource { |
接下来自定义一个注解,用来在Service方法上面注解使用哪个数据源:
1 | /** |
最后,最核心的AOP类定义:
1 | /** |
这里使用到了注解@ConditionalOnProperty,只有当我的配置文件中muti-datasource-open=true的时候注解才会生效。
另外还有一个要注意的地方,就是order,aop的顺序一定要早于spring的事务,这里我将它设置成1,后面你会看到我将spring事务顺序设置成2。
配置类
首先有两个属性类:
DruidProperties
连接池的属性类MutiDataSourceProperties
biz数据源的属性类
然后定义配置类:
1 |
|
代码其实很好理解,我就不再多做解释了。
然后步骤跟普通的集成MyBatis是一样的,我简单的过一遍。
实体类
1 |
|
定义DAO
1 | public interface UserMapper extends BaseMapper<User> { |
定义Service
1 |
|
这里唯一要说明的就是我在方法findById1()
上面增加了注解@DataSource(name = DSEnum.DATA_SOURCE_BIZ)
,这样这个方法就会访问biz数据库。
注意,不加注解就会访问默认数据库pos。
测试
最后编写一个简单的测试,我只测试findById()
方法和findById1()
方法,看它们是否访问的是不同的数据源。
1 |
|
运行测试,结果显示为green bar,成功!