以AOP的方式实现多数据源比较方便,service执行之前设置数据源.在Controller里面同时查询两个数据库皆可完成.
application.properties配置:
spring.datasource1.jdbc-url=jdbc:hsqldb:hsql//199.34.176.91:30710/aaaaaa
spring.datasource1.username=root
spring.datasource1.password=123456
spring.datasource1.driver-class-name=org.hsqldb.jdbcDriver
spring.datasource2.jdbc-url=jdbc:hsqldb:hsql//199.34.176.91:30710/aaaaaa
spring.datasource2.username=root
spring.datasource2.password=123456
spring.datasource2.driver-class-name=org.hsqldb.jdbcDriver
创建DataSource Bean:
package liu.cn.ilxj;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourcesConfig {
@Bean("datasource1")
@ConfigurationProperties(prefix = "spring.datasource1")
public DataSource dataSource1(){
return DataSourceBuilder.create().build();
}
@Bean("datasource2")
@ConfigurationProperties(prefix = "spring.datasource2")
public DataSource dataSource2(){
return DataSourceBuilder.create().build();
}
}
给当前线程设置数据源
package liu.cn.ilxj;
public class DataSourceSwitchChoose {
private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void setDB(String dataSourceType){
threadLocal.set(dataSourceType);
}
public static String getDataSourceName(){
return threadLocal.get();
}
}
关键步骤:
package liu.cn.ilxj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
@Component
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {
@Autowired
@Qualifier("datasource1")
private DataSource datasource1;
@Autowired
@Qualifier("datasource2")
private DataSource datasource2;
@Override
protected Object determineCurrentLookupKey() {
return DataSourceSwitchChoose.getDataSourceName();
}
@Override
public void afterPropertiesSet() {
Map<Object,Object>map = new HashMap<>();
map.put("datasource1",datasource1);
map.put("datasource2",datasource2);
setTargetDataSources(map);
setDefaultTargetDataSource(datasource1);
super.afterPropertiesSet();
}
}
AOP实现动态切换(任何切换方式都可以)
package liu.cn.ilxj;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AopDataSourceSwtichChoose {
@Before("execution(* liu.cn.ilxj.serviceDb1.*.*(..))")
public void befaoreSwitchds(){
DataSourceSwitchChoose.setDB("datasource1");
}
@Before("execution(* liu.cn.ilxj.serviceDb2.*.*(..))")
public void befaoreSwitchds2(){
DataSourceSwitchChoose.setDB("datasource1");
}
}
关闭默认配置datasource
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
项目结构