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

说明与注意

  1. 多数据源配置的时候,与单数据源不同点在于spring.datasource之后多需要取不同数据源名称,如primarysecondary来区分不同的数据源配置,这个前缀将在后续初始化数据源的时候用到;

  2. 数据源连接配置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);
    }

}

PS: Spring 注解 @Qualifier 详细解析

依赖注入

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;

posted @   小白酒菊  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示