一、实现目标:
1) 可以灵活的在项目中添加新的数据源
2) 可以通过注解的方式动态切换数据源
3) 集成HttpClient实现api的远程调用
二、实现思路:
单数据源的时候,只要把初始化的数据源注入到对应的事务管理器TransactionManager和SqlSessionFactoryBean
中去即可;
多数剧源的时候,只需要定义一个自定义的数据源类,把其代替单数据源注入对应的事务管理器TransactionManager
和SqlSessionFactoryBean中去即可;
自定义的数据源,需要包含项目所有的的数据源信息,而且最好设置一个默认的数据源
三、实现方法:
根据实现思路,根据现有框架所支持的,自定义的数据源类只需继承AbstractRoutingDataSource类,重写
determineCurrentLookupKey方法即可
四、需要解决的问题:
1) 如何在项目启动的时候根据配置文件的信息,初始化所有的数据源,并把所有的数据源注入自定义的数据源类
2) 如何在执行业务方法的时候,自动切换数据源
问题1的解决方案: 利用下面注解实现根据属性文件初始化数据源信息
@EnableConfigurationProperties
@Configuration
@ConfigurationProperties(prefix = "master.datasource.druid")
@PropertySource(value = "classpath:masterdb.properties")
利用下面的注解,把数据源信息注入到自定义的数据源中去
@Autowired
1.1) 定义一个基类
package com.roger.core.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import javax.sql.DataSource;
import java.sql.SQLException;
@Data
public class DBConfig {
protected String driverClassName;
protected String url;
protected String userName;
protected String password;
protected int initialSize;
protected int minIdle;
protected int maxActive;
protected long maxWait;
protected boolean poolPreparedStatements;
protected String validationQuery;
protected boolean testOnBorrow;
protected boolean testOnReturn;
protected boolean testWhileIdle;
protected long timeBetweenEvictionRunsMillis;
protected long minEvictableIdleTimeMillis;
protected String filters;
public DataSource initDruidDataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClass