公司某项目做大屏展示,但数据来源自7个不同的数据库,需要涉及跨库查询,要求。
本项目采用SpringBoot+MybatisPlus做服务端提供RESTful接口,前后端分离开发,总结一下项目中实现的动态数据源切换的实现方式。
首先在application文件中配置数据源
spring: aop: proxy-target-class: true auto: true datasource: druid: # 一期数据源 db1: url: jdbc:oracle:thin:@172.16.3.131:1521:orcl username: ZHJGDSJ password: ZHJGDSJ driver-class-name: oracle.jdbc.driver.OracleDriver initialSize: 5 minIdle: 5 maxActive: 20 # 二期 诚信监管 db2: url: jdbc:oracle:thin:@172.17.2.119:1521:orcl username: cxjg_test1 password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver initialSize: 5 minIdle: 5 maxActive: 20 # 二期 协同监管 db3: url: jdbc:oracle:thin:@172.17.2.119:1521:orcl username: xtjg_test password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver initialSize: 5 minIdle: 5 maxActive: 20 # 二期 公示系统 db4: url: jdbc:oracle:thin:@172.17.2.119:1521:orcl username: GSGS password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver initialSize: 5 minIdle: 5 maxActive: 20 # 二期 省局-浪潮库 db5: url: jdbc:oracle:thin:@172.16.1.26:1521:orcl username: GSYW password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver initialSize: 5 minIdle: 5 maxActive: 20 # 二期 市局-浪潮库 db6: url: jdbc:oracle:thin:@172.16.1.65:1521:orcl username: GSYWSJ password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver initialSize: 5 minIdle: 5 maxActive: 20 # 二期 正元 db7: url: jdbc:oracle:thin:@172.17.2.119:1521:orcl username: ZHJGDSJ password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver initialSize: 5 minIdle: 5 maxActive: 20
创建一个数据源枚举类
package com.rexen.di.management.common.type; /** * @Author Jimmy * @date 2019/2/7. */ public enum DBTypeEnum { db1("db1"), db2("db2"), db3("db3"), db4("db4"), db5("db5"), db6("db6"), db7("db7"); private String value; DBTypeEnum(String value) { this.value = value; } public String getValue() { return value; } }
创建一个上下文来缓存当前数据源
package com.rexen.di.management.boot.config; import com.rexen.di.management.common.type.DBTypeEnum; /** * @Author Jimmy * @date 2019/2/7. */ public class DbContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal<>(); /** * 设置数据源 * @param dbTypeEnum */ public static void setDbType(DBTypeEnum dbTypeEnum) { contextHol