06.Spring Boot多数据源配置
多数据源配置
配置文件设置数据库
先在Spring Boot的配置文件application.properties
中设置两个或多个要链接的数据库:
spring.datasource.druid.jdbc-url=jdbc:mysql://rm-bp177825s6ht991.mysql.rds.aliyuncs.com:3306/test1
spring.datasource.druid.username=horseweed
spring.datasource.druid.password=
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.secondary.jdbc-url=jdbc:mysql://rm-bp177825s6ht991.mysql.rds.aliyuncs.com:3306/test2
spring.datasource.druid.secondary.username=horseweed
spring.datasource.druid.secondary.password=
spring.datasource.druid.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
说明与注意:
-
多数据源配置的时候,与单数据源不同点在于
spring.datasource
之后多需要取不同数据源名称,如primary
和secondary
来区分不同的数据源配置,这个前缀将在后续初始化数据源的时候用到; -
数据源连接配置2.x和1.x的配置项是有区别的:
2.x使用
spring.datasource.druid.secondary.jdbc-url
;1.x版本使用
spring.datasource.druid.secondary.url
;如果配置的时候发生了这个报错
java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
,那么就是这个配置项的问题。
初始化数据源与JdbcTemplate
完成多数据源的配置信息之后,就来创建个配置类来加载这些配置信息,初始化数据源,以及初始化每个数据源要用的JdbcTemplate
import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfiguration {
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
return new JdbcTemplate(primaryDataSource);
}
@Bean
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
return new JdbcTemplate(secondaryDataSource);
}
}
依赖注入
package com.didispace.chapter37;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class TestService {
@Autowired
// @Qualifier("secondaryJdbcTemplate")
protected JdbcTemplate primaryJdbcTemplate;
@Autowired
// @Qualifier("primaryJdbcTemplate")
protected JdbcTemplate secondaryJdbcTemplate;
public int test() {
// 往第一个数据源中插入 2 条数据
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20);
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30);
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "小小徐", 16);
// 往第二个数据源中插入 1 条数据,若插入的是第一个数据源,则会主键冲突报错
secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20);
return 1;
}
}
注意:
在使用
@Autowired
进行自动装配时,如果 Spring 没有其他提示,将会按照需要注入的变量名称来寻找合适的 Bean,以解决依赖注入歧义的问题同时,当我们创建Bean的时候,Spring默认会使用方法名称来作为Bean的名称
此处注入Bean时如果不用@Qualifier来标记,那么会根据'primaryJdbcTemplate'变量名来自动注入;如果使用@Qualifier注解,则会根据注解内容来确定注入的Bean;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库