《SpringBoot》如何配置多个数据源
作者:互联网
起因:
配置一个数据源我们知道可以在yml文件或者properties中编写配置,利用SpringBoot自动配置的特性完成绑定,但如果我们需要依赖一个以上的多个数据源这该怎么办呢?
解决方案:
不同的数据源配置要分开,避免混在一起,一定要注意正在操作的数据源是哪个。
首先我们需要排除SpringBoot对数据源的自动配置,利用exclude属性将DataSourceAutoConfiguration,DataSourceTransactionManagerAutoConfiguration,JdbcTemplateAutoConfiguration排除。
如下图:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class
})
@Slf4j
public class MultiDataSourceApplication {
public static void main(String[] args) {
SpringApplication.run(MultiDataSourceApplication.class, args);
}
}
这样做消除了框架对数据源一系列的自动配置,我们可以手动去控制它们。
先来看下properties配置文件,声明两种数据源url分别是default和text。
management.endpoints.web.exposure.include=*
spring.output.ansi.enabled=ALWAYS
default.datasource.url=jdbc:h2:file:~/default
default.datasource.username=MRyan
default.datasource.password=123456
text.datasource.url=jdbc:h2:file:~/text
text.datasource.username=
text.datasource.password=
然后我们手动配置一个数据源
创建一个配置类DataSourceProperties绑定Properties配置文件,数据源我们采用配置文件中声明的default url。
/**
* default数据源
* 利用@ConfigurationProperties为DataSourceProperties赋值 获取application.properties配置文件
*/
@Bean
@ConfigurationProperties("default.datasource")
public DataSourceProperties defaultSourceProperties() {
return new DataSourceProperties();
}
接着创建DataSource的bean并且输出log日志查看数据源url。
/**
* 创建DataSource的bean
*/
@Bean
public DataSource defaultDataSource() {
DataSourceProperties dataSourceProperties = defaultSourceProperties();
log.info("default datasource:{}", dataSourceProperties.getUrl());
return dataSourceProperties.initializeDataSourceBuilder().build();
}
然后为上述创建的DataSource的Bean创建对应的事务管理器
/**
* 为上述创建的DataSource的Bean创建对应的事务管理器
*/
@Bean
@Resource
public PlatformTransactionManager defaultManager(DataSource defaultDataSource) {
return new DataSourceTransactionManager(defaultDataSource);
}
这个时候我们就配置好一个数据源了,可以运行输出下没什么问题。
用同样的方法我们配置第二个数据源text
//******************************************************
/**
* text数据源
* 利用@ConfigurationProperties为DataSourceProperties赋值 获取application.properties配置文件
*/
@Bean
@ConfigurationProperties("text.datasource")
public DataSourceProperties textSourceProperties() {
return new DataSourceProperties();
}
/**
* 创建DataSource的bean
*/
@Bean
public DataSource textDataSource() {
DataSourceProperties dataSourceProperties = textSourceProperties();
log.info("text datasource:{}", dataSourceProperties.getUrl());
return dataSourceProperties.initializeDataSourceBuilder().build();
}
/**
* 为上述创建的DataSource的Bean创建对应的事务管理器
*/
@Bean
@Resource
public PlatformTransactionManager textManager(DataSource textDataSource) {
return new DataSourceTransactionManager(textDataSource);
}
最终的代码如下:
/**
* @description: SpringBoot如何配置多个数据源
* @Author MRyan
* @Date 2020/10/8 15:53
* @Version 1.0
*/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class
})
@Slf4j
public class MultiDataSourceApplication {
public static void main(String[] args) {
SpringApplication.run(MultiDataSourceApplication.class, args);
}
/**
* default数据源
* 利用@ConfigurationProperties为DataSourceProperties赋值 获取application.properties配置文件
*/
@Bean
@ConfigurationProperties("default.datasource")
public DataSourceProperties defaultSourceProperties() {
return new DataSourceProperties();
}
/**
* 创建DataSource的bean
*/
@Bean
public DataSource defaultDataSource() {
DataSourceProperties dataSourceProperties = defaultSourceProperties();
log.info("default datasource:{}", dataSourceProperties.getUrl());
return dataSourceProperties.initializeDataSourceBuilder().build();
}
/**
* 为上述创建的DataSource的Bean创建对应的事务管理器
*/
@Bean
@Resource
public PlatformTransactionManager defaultManager(DataSource defaultDataSource) {
return new DataSourceTransactionManager(defaultDataSource);
}
//******************************************************
/**
* text数据源
* 利用@ConfigurationProperties为DataSourceProperties赋值 获取application.properties配置文件
*/
@Bean
@ConfigurationProperties("text.datasource")
public DataSourceProperties textSourceProperties() {
return new DataSourceProperties();
}
/**
* 创建DataSource的bean
*/
@Bean
public DataSource textDataSource() {
DataSourceProperties dataSourceProperties = textSourceProperties();
log.info("text datasource:{}", dataSourceProperties.getUrl());
return dataSourceProperties.initializeDataSourceBuilder().build();
}
/**
* 为上述创建的DataSource的Bean创建对应的事务管理器
*/
@Bean
@Resource
public PlatformTransactionManager textManager(DataSource textDataSource) {
return new DataSourceTransactionManager(textDataSource);
}
}
运行并输出日志
正常运行,并没有什么问题。
标签:SpringBoot,多个,DataSourceProperties,数据源,Bean,DataSource,public,datasource 来源: https://blog.csdn.net/qq_35416214/article/details/110633172