springboot多数据源配置及切换
注:本文的多数据源配置及切换的实现方法是,在框架中封装,具体项目中配置及使用,也适用于多模块项目
配置文件数据源读取
通过springboot的Envioment和Binder对象进行读取,无需手动声明DataSource的Bean
yml数据源配置格式如下:
spring: datasource: master: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/main? useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: root password: 11111 cluster: - key: db1 type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/haopanframetest_db1? useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: root password: 11111 - key: db2 type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/haopanframetest_db2? useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: root password: 11111
master为主数据库必须配置,cluster下的为从库,选择性配置
获取配置文件信息代码如下
动态加入数据源
定义获取数据源的Service,具体项目中进行实现
获取对应Service的所有实现类进行调用
通过代码进行数据源注册
主要是用过继承类AbstractRoutingDataSource,重写setTargetDataSources/setDefaultTargetDataSource方法
通过切面注解统一切换
定义注解
定义基于线程的切换类
定义切面
方法的注解优先级高于类注解,一般用于Service的实现类
分库切换
开发过程中某个库的某个表做了拆分操作,相同的某一次数据库操作可能对应到不同的库,需要对方法级别进行精确拦截,可以定义一个业务层面的切面,规定每个方法必须第一个参数为dbName,根据具体业务找到对应的库传参