Spring系列之多个数据源配置

前言#

我们在实际场景中,会有需要配置多个数据源的场景,比如说,我们在支付系统中,单笔操作(包含查询、插入、新增)中需要操作主库,在批量查询或者对账单查询等对实时性要求不高的场景,需要使用读库来操作,依次来减轻数据库的压力。那么我们如何配置多数据源?

这里还是基于springboot应用的情况下,我们看一下怎么配置。
因为SpringBoot会实现自动配置,但是SpringBoot并不知道我们的业务场景分别要使用哪一个数据源,因此我们需要把相关的自动配置关闭。

首先,生成项目骨架,引入相应的依赖

Copy Line-numbers language-xml  
 		org.springframework.boot
 		spring-boot-starter-jdbc
 	
 	
 		org.springframework.boot
 		spring-boot-starter-actuator
 	
 	
 		org.springframework.boot
 		spring-boot-starter-web
 	

 	
 		com.h2database
 		h2
 		runtime
 	
 	
 		org.projectlombok
 		lombok
 		true
 	
 	
 		org.springframework.boot
 		spring-boot-starter-test
 		test
 	
 	```
**然后,在Application排除自动装配类**   

```java
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,JdbcTemplateAutoConfiguration.class})
@Slf4j
public class MultiDataSourceDemoApplication {
}

上面代码中,我们排除了
DataSourceAutoConfiguration、DataSourceTransactionManagerAutoConfiguration、JdbcTemplateAutoConfiguration三个类,然后就可以自己定义DataSource了。

配置数据源

Copy Line-numbers language-java	//第一个数据源
	@Bean
	@ConfigurationProperties("first.datasource")
	public DataSource firstDataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean
	public JdbcTemplate firstJdbcTemplate() {
		return new JdbcTemplate(firstDataSource());
	}


	@Bean
	@Resource
	public PlatformTransactionManager firstTxManager(DataSource firstDataSource) {
		return new DataSourceTransactionManager(firstDataSource);
	}

	//第二个数据源
	@Bean
	@ConfigurationProperties("second.datasource")
	public DataSource secondDataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean
	public JdbcTemplate secondJdbcTemplate() {
		return new JdbcTemplate(secondDataSource());
	}

	@Bean
	@Resource
	public PlatformTransactionManager secondTxManager(DataSource secondDataSource) {
		return new DataSourceTransactionManager(secondDataSource);
	}

application.properties的配置项信息

Copy Line-numbers language-xmlmanagement.endpoints.web.exposure.include=*
spring.output.ansi.enabled=ALWAYS

first.datasource.jdbc-url=jdbc:mysql://localhost:3306/first
first.datasource.username=root
first.datasource.password=xxx
second.datasource.jdbc-url=jdbc:mysql://localhost:3306/second
second.datasource.username=root
second.datasource.password=xxx

看一下表结构和数据

Spring系列之多个数据源配置_第1张图片

Spring系列之多个数据源配置_第2张图片

运行测试代码:

Copy Line-numbers language-java	@Test
	public void testMutilDataSource(){
		firstJdbcTemplate.queryForList("SELECT * FROM test1")
				.forEach(row -> log.info("记录:"+row.toString()));

		secondJdbcTemplate.queryForList("SELECT * FROM test2")
				.forEach(row -> log.info("记录:"+row.toString()));
	}

我们看一下运行效果:

Spring系列之多个数据源配置_第3张图片

我们可以看到,两个数据源都初始化成功了,并且各自数据源执行的结果准确

你可能感兴趣的:(spring,spring,boot,restful,架构,程序人生)