我们在实际项目开发中,经常会遇到一个项目需要同时连接、访问多个数据库,进行业务处理。或者是随着项目运营,业务越来越复杂,原来的一个库也要进行业务拆分为多个库,这时也会面临同样的问题,一个项目连接、访问多个库。又或者主从分离、读写分离等等情况。那么本文就主要是以代码来呈现、讲解在SpringBoot项目中我们如何配置多数据源。
多数据库访问
一、数据库连接信息配置
在application.yml配置文件中,添加对应数据库连接信息,如下所示:
spring: datasource: master: # 这是第一个数据源名称,可自定义 url: jdbc:mysql://127.0.0.1:3306/master_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 123456 slave: # 这是第二个数据源名称,可自定义 url: jdbc:mysql://127.0.0.1:3306/slave_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 123456
这里目前定义了两个数据源,库一“master”和库二“slave”,如果有更多的数据源,则按照这个配置规则继续往下追加即可。其中,数据源名称是自定义的,只要不重名就可以。
二、数据源配置
在DataSourceConfig中设置这两个数据库的连接配置。具体代码如下:
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; /** * 数据源配置 */ @Configuration public class DataSourceConfig { //数据源配置 master数据源 @Primary @Bean(name = "masterDataSourceProperties") @ConfigurationProperties(prefix = "spring.datasource.master") public DataSourceProperties masterDataSourceProperties() { return new DataSourceProperties(); } //数据源 master数据源 @Primary @Bean(name = "masterDataSource") public DataSource masterDataSource(@Qualifier("masterDataSourceProperties") DataSourceProperties dataSourceProperties) { return dataSourceProperties.initializeDataSourceBuilder().build(); } //数据源配置 slave数据源配置 @Bean(name = "slaveDataSourceProperties") @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSourceProperties slaveDataSourceProperties() { return new DataSourceProperties(); } //数据源 slave数据源 @Bean("slaveDataSource") public DataSource slaveDataSource(@Qualifier("slaveDataSourceProperties") DataSourceProperties dataSourceProperties) { return dataSourceProperties.initializeDataSourceBuilder().build(); } }
三、JdbcTemplate多数据源配置
配置数据源连接工厂,具体代码如下:
import org.springframework.beans.factory.annotation.Qualifier; 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; /** * JdbcTemplate多数据源配置 */ @Configuration public class JdbcTemplateDataSourceConfig { //JdbcTemplate数据源 mater @Primary @Bean(name = "materJdbcTemplate") public JdbcTemplate materJdbcTemplate(@Qualifier("materDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } //JdbcTemplate数据源 slave @Bean(name = "slaveJdbcTemplate") public JdbcTemplate slaveJdbcTemplate(@Qualifier("slaveDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } }
注:1、“@Primary”指的是在相同的bean中,优先使用该注解的bean。
2、“@Qualifier”指定某个bean有没有资格进行注入。
到此多数据源的配置工作已经完成。
四、应用
一般我们根据实际情况,在server层注入对应的dao就可以使用,如下代码所示:
/** * Demo演示 */ @Service public class DemoServiceImpl implements DemoService { @Autowired @Qualifier("masterJdbcTemplate") private JdbcTemplate masterJdbcTemplate; @Autowired @Qualifier("slaveJdbcTemplate") private JdbcTemplate slaveJdbcTemplate; /** * 查询master库 */ @Override public void queryMaster() { // TODO masterJdbcTemplate.queryForList() } /** * 查询slave库 */ @Override public void querySlave() { // TODO slaveJdbcTemplate.queryForList() } }
以上就是SpringBoot项目多数据源配置代码实现及简单应用示例。