在工作的springboot项目中用到了多数据源,在网上搜索了一通没有找到满意的答案,最后通过查看springboot的源代码找到了解决问题的思路;
项目配置文件
#dataBase
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@xx.xx.xx.xx:1521:xxx
spring.datasource.username=xxxxxx
spring.datasource.password=xxxx
spring.datasourceP0.type=com.alibaba.druid.pool.DruidDataSource
spring.datasourceP0.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasourceP0.url=jdbc:oracle:thin:@xx.xx.xx.xx:1521:xx
spring.datasourceP0.username=xx
spring.datasourceP0.password=xx
。。。。。。。。。。。。。。。。。。。
#jndi
#spring.datasource.jndi-name=APP
#spring.datasourceP0.jndi-name=P0
#spring.datasourceP2.jndi-name=P2
通过配置文件决定使用jdbc的数据源或者jndi的数据源
然后新增DruidDataSource的配置文件
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
@ConditionalOnProperty(prefix = "spring.datasource", name ={ "url","username","password"})
public class DataSourceConfigApp {
@Bean(name = "dataSource")
@Primary
@ConfigurationProperties(prefix="spring.datasource")
@ConditionalOnProperty(prefix = "spring.datasource", name ={ "url","username","password"})
@ConditionalOnMissingBean
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSourceP0")
@ConfigurationProperties(prefix="spring.datasourceP0")
@ConditionalOnProperty(prefix = "spring.datasourceP0", name ={ "url","username","password"})
public DataSource dataSourceP0(){
// return DataSourceBuilder.create().driverClassName("com.alibaba.druid.pool.DruidDataSource").build();
// return new DruidDataSource();
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSourceP2")
@ConfigurationProperties(prefix="spring.datasourceP2")
@ConditionalOnProperty(prefix = "spring.datasourceP2", name ={ "url","username","password"})
public DataSource dataSourceP2(){
// return DataSourceBuilder.create().driverClassName("com.alibaba.druid.pool.DruidDataSource").build();
// return new DruidDataSource();
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSourceDataP0")
@ConfigurationProperties(prefix="spring.datasourceDataP0")
@ConditionalOnProperty(prefix = "spring.datasourceDataP0", name ={ "url","username","password"})
public DataSource dataSourceDataP0(){
return DataSourceBuilder.create().build();
}
@Bean(name="primarySqlSessionFactory")
@Primary
@ConfigurationProperties(prefix="spring.datasource")
@ConditionalOnProperty(prefix = "spring.datasource", name ={ "url","username","password"})
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
return sessionFactory.getObject();
}
@Bean(name = "P0SqlSessionFactory")
@ConditionalOnProperty(prefix = "spring.datasourceP0", name ={ "url","username","password"})
public SqlSessionFactory sqlSessionFactoryP0() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceP0());
return sessionFactory.getObject();
}
@Bean(name = "P2SqlSessionFactory")
@ConditionalOnProperty(prefix = "spring.datasourceP2", name ={ "url","username","password"})
public SqlSessionFactory sqlSessionFactoryP2() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceP2());
return sessionFactory.getObject();
}
@Bean(name = "DataP0SqlSessionFactory")
@ConditionalOnProperty(prefix = "spring.datasourceDataP0", name ={ "url","username","password"})
public SqlSessionFactory sqlSessionFactoryDataP0() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceDataP0());
return sessionFactory.getObject();
}
}
新增jndi数据源配置
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
@ConditionalOnProperty(prefix = "spring.datasource", name = "jndi-name")
public class JndiDataSourceConfigApp{
@Value("${spring.datasource.jndi-name}")
private String jndiApp;
@Value("${spring.datasourceP0.jndi-name}")
private String jndiP0;
@Value("${spring.datasourceP2.jndi-name}")
private String jndiP2;
@Value("${spring.datasourceDataP0.jndi-name}")
private String jndiDataP0;
private final ApplicationContext context;
public JndiDataSourceConfigApp(ApplicationContext context) {
this.context = context;
}
@Bean("dataSource")
@ConditionalOnMissingBean
@Primary
@ConditionalOnProperty(prefix = "spring.datasource", name = "jndi-name")
public DataSource dataSource() {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
DataSource dataSource = dataSourceLookup.getDataSource(jndiApp);
excludeMBeanIfNecessary(dataSource, "dataSource");
return dataSource;
}
@Bean(name="dataSourceP0")
@ConditionalOnProperty(prefix = "spring.datasourceP0", name = "jndi-name")
public DataSource dataSourceP0() {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
DataSource dataSource = dataSourceLookup.getDataSource(jndiP0);
return dataSource;
}
@Bean(name="dataSourceP2")
@ConditionalOnProperty(prefix = "spring.datasourceP2", name = "jndi-name")
public DataSource dataSourceP2() {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
DataSource dataSource = dataSourceLookup.getDataSource(jndiP2);
return dataSource;
}
@Bean(name="dataSourceDataP0")
@ConditionalOnProperty(prefix = "spring.datasourceDataP0", name = "jndi-name")
public DataSource dataSourceDataP0() {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
DataSource dataSource = dataSourceLookup.getDataSource(jndiDataP0);
return dataSource;
}
private void excludeMBeanIfNecessary(Object candidate, String beanName) {
for (MBeanExporter mbeanExporter : this.context
.getBeansOfType(MBeanExporter.class).values()) {
if (JmxUtils.isMBean(candidate.getClass())) {
mbeanExporter.addExcludedBean(beanName);
}
}
}
@Bean(name="primarySqlSessionFactory")
@Primary
@ConfigurationProperties(prefix="spring.datasource")
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
return sessionFactory.getObject();
}
@Bean(name = "P0SqlSessionFactory")
@ConditionalOnProperty(prefix = "spring.datasourceP0", name = "jndi-name")
public SqlSessionFactory sqlSessionFactoryP0() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceP0());
return sessionFactory.getObject();
}
@Bean(name = "P2SqlSessionFactory")
@ConditionalOnProperty(prefix = "spring.datasourceP2", name = "jndi-name")
public SqlSessionFactory sqlSessionFactoryP2() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceP2());
return sessionFactory.getObject();
}
}
后续再配置mybatis 中使用配置的DataSource,SqlSessionFactory 来切换数据源