SpringBoot学习笔记之动态数据源切换

Springboot 动态数据源切换
1)、配置文件application.properties
# 更多数据源
custom.datasource.names=ds1,ds2
custom.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver custom.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1
custom.datasource.ds1.username=root
custom.datasource.ds1.password=123456
custom.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver custom.datasource.ds2.url=jdbc:mysql://localhost:3306/ds2
custom.datasource.ds2.username=root
custom.datasource.ds2.password=123456

2)、配置文件中加上配置
#mybatis配置
mybatis.typeAliasesPackage=com.vk.liyj
#匹配mapper下的所有mapper.xml
#mybatis.mapperLocations=classpath:com/vk/liyj/mapper/*Mapper.xml
#匹配指定包下的所有mapper.xml
mybatis.mapperLocations=classpath*:com/vk/liyj/**/*Mapper.xml

3)、动态数据源切换相关代码在dynamicDataSource包下
TargetDataSource为我们自定义的annotation。
DynamicDataSourceRegister类为数据源动态切换的核心类。该类实现了ImportBeanDefinitionRegistrar和EnvironmentAware这两个接口,这两个接口在系统启动时被分别调用。这两个接口的执行是有先后顺序的,EnvironmentAware接口的setEnvironment方法会先被执行完成默认数据源和自定义数据源的初始化,然后再执行ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法完成默认数据源和目标数据源的注册。
DynamicDataSourceContextHolder类中使用了ThreadLocal来保存当前线程使用的数据源,当前线程id是key,value是数据源名称。dataSourceIds用于保存系统配置的数据源名称。
DynamicDataSourceAspect是AOP类,主要完成前置和后置功能加强。该类中有两个要注意的地方,@Aspect必须引用,表示这是一个AOP类,@Order(-1)表示该类要被AOP链式调用时优先被执行。
DynamicDataSource类继承了AbstractRoutingDataSource类,在执行service方法调用之前被调用该方法获取数据源。

4)、在SpringBootSampleApplication中启动类注册动态数据源
//注册动态多数据源
@Import({DynamicDataSourceRegister.class})
//启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
@EnableTransactionManagement

5)、在需要切换数据源的地方增加TargetDataSource注解,ds2就是我们配置在properties中的名字。Transactional表示该方法使用事务控制。
@Transactional
@TargetDataSource(name = "ds2")

5)、导入ds1,ds2数据库脚本

6)、SpringBootTest 中的testDS1(),testDS2(),testDefaultDS(),testDefaultDSAdd()进行测试。

源码下载地址:http://download.csdn.net/download/liyuejin/9986140

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章