我们在实际项目开发中,经常会遇到一个项目需要同时连接、访问多个数据库,进行业务处理。或者是随着项目运营,业务越来越复杂,原来的一个库也要进行业务拆分为多个库,这时也会面临同样的问题,一个项目连接、访问多个库。又或者主从分离、读写分离等等情况。那么本文就主要是以代码来呈现、讲解在SpringBoot项目中我们如何配置多数据源。

springboot配置多数据源(springboot项目从数据库获取配置)(1)

多数据库访问

一、数据库连接信息配置

在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项目多数据源配置代码实现及简单应用示例。