spring boot多数据源配置

在工作的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 来切换数据源

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值