完成动态切换双数据源有些时间了,刚刚又接入了第三个数据源,顺便把这块的逻辑梳理、记录、分享一下;
交代下项目环境:springboot2.0.1, mybatis3,jdk1.8,druid 1.1.0
下面主要是贴代码了,并配以简单说明,从配置文件说起:(druid 的配置就不贴了)
建立一个DataSourceConfig类,主要加载配置文件中的数据库信息及连接池信息,并实例化DataSource对象和
给出一个示例:
// -----------------------------------------mysql config-------------------------------------@Value("${spring.datasource.mysql.url}")
private String mysqlUrl;
@Value("${spring.datasource.mysql.finedb.url}")
private String finedbUrl;
@Value("${spring.datasource.mysql.username}")
private String username;
@Value("${spring.datasource.mysql.password}")
private String password;
@Value("${spring.datasource.mysql.driverClassName}")
private String driverClassName;
// -----------------------------------------mysql config-------------------------------------
@Bean(name="dataSourceMysql")
public DataSource dataSourceMysql(){
System.out.println("----------------加载mysql" + mysqlUrl);
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(mysqlUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
setDruidOptions(datasource); // 设置druid数据源的属性
return datasource;
}
private void setDruidOptions(DruidDataSource datasource){
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
datasource.setKeepAlive(true);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
log.error("druid configuration initialization filter Exception", e);
}
}
@Bean(name = "dynamicDataSource") //将三个数据源装起来
@Primary
public DataSource dataSource(){
DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance(); //私有化构造了 不能直接new
DataSource mysql = dataSourceMysql();
// DataSource finedb = dataSourceFinedb();
// DataSource oracle = dataSourceOracle();
//设置默认数据源
dynamicDataSource.setDefaultTargetDataSource(mysql);
//配置多个数据源
Map<Object,Object> map = new HashMap<>();
map.put(DataSourceTypeEnum.Mysql.getName(),mysql);
// map.put(DataSourceTypeEnum.Oracle.getName(),oracle);
// map.put(DataSourceTypeEnum.FineDB.getName(),finedb);
dynamicDataSource.setTargetDataSources(map);
return dynamicDataSource;
}
接着就说到了DynamicDataSource类,理解为放三个数据源的容器,新建类并继承AbstractRoutingDataSource并重写其方法:
截图吧,自己跟着敲一敲 有好处,哈哈!
接着说到JdbcContextHolder这个类,作用获取和设置当前线程用到的数据源,建立:
另外需要设置SqlSessionFactory:
上面还有一个枚举类:
下面这个类DataSourceAopInService 就是执行切面切换数据源了(* 在service层决定数据源):
后面字体变小了,不然一个图截不下,哈哈!
然后就可以在service层使用注解动态切换数据源了,示例如:
注意:没有注解默认使用mysql的数据源:
好了,以上就是实操代码,欢迎各位参考或给出宝贵意见!喜欢的话可以点赞或转发!