springboot配置多个数据源

在配置多个数据源的时候通常连接方式配置在配置文件中,程序可以通过@Value读取配置,也可通过@ConfigurationProperties读取,分别记录一下

一:通过@value读取配置,配置多数据源

valueconfig配置数据源和jdbc模板

注:不同的模板配置有不同的实现方式,这里统一采用JdbcTemplate,配置比较简单

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;


@Configuration
public class ValueConfig {

    /**
     * user库连接信息
     */
    @Value("${user.jdbc.driver}")
    private String userDriver;
    @Value("${user.jdbc.url}")
    private String userUrl;
    @Value("${user.jdbc.username}")
    private String userUsername;
    @Value("${user.jdbc.password}")
    private String userPassword;

    /**
     * user库数据源
     * @return
     */
    @Bean
    public DataSource valueUserDataSource(){
        DriverManagerDataSource driverManager=new DriverManagerDataSource();
        driverManager.setDriverClassName(userDriver);
        driverManager.setUrl(userUrl);
        driverManager.setUsername(userUsername);
        driverManager.setPassword(userPassword);
        return driverManager;
    }


    /**
     * user库的连接
     * @param dataSource
     * @return
     */
    @Bean("valueUserJdbcTemplate")
    public JdbcTemplate userJdbcTemplate(@Qualifier("valueUserDataSource")
                                         DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }


    /**
     * log库连接信息
     */
    @Value("${log.jdbc.driver}")
    private String logDriver;
    @Value("${log.jdbc.url}")
    private String logUrl;
    @Value("${log.jdbc.username}")
    private String logUsername;
    @Value("${log.jdbc.password}")
    private String logPassword;

    /**
     * log库数据源
     * @return
     */
    @Bean
    public DataSource valueLogDataSource(){
        DriverManagerDataSource driverManager=new DriverManagerDataSource();
        driverManager.setDriverClassName(logDriver);
        driverManager.setUrl(logUrl);
        driverManager.setUsername(logUsername);
        driverManager.setPassword(logPassword);
        return driverManager;
    }

    /**
     * log库的连接
     * @param dataSource
     * @return
     */
    @Bean("valueLogJdbcTemplate")
    public JdbcTemplate logJdbcTemplate(@Qualifier("valueLogDataSource")
                                        DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }

}

二:通过@ConfigurationProperties读取配置,配置多数据源

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;


@Configuration
public class ConfigurationPropertiesConfig {

    /**
     * 本地mysql的user库的数据配置
     * @return
     */
    @Bean
    @ConfigurationProperties(prefix = "user.jdbc")
    public DataSourceProperties userDataSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * 本地mysql的log库的数据配置
     * @return
     */
    @Bean
    @ConfigurationProperties(prefix = "log.jdbc")
    public DataSourceProperties logDataSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * user库数据源
     * @return
     */
    @Bean
    public DataSource userDataSource() {
        return userDataSourceProperties().initializeDataSourceBuilder().build();
    }

    /**
     * log库数据源
     * @return
     */
    @Bean
    public DataSource logDataSource() {
        return logDataSourceProperties().initializeDataSourceBuilder().build();
    }

    /**
     * user库的连接
     * @param dataSource
     * @return
     */
    @Bean
    public JdbcTemplate userJdbcTemplate(@Qualifier("userDataSource")
                                         DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }

    /**
     * log库的连接
     * @param dataSource
     * @return
     */
    @Bean
    public JdbcTemplate logJdbcTemplate(@Qualifier("logDataSource")
                                        DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }

}

测试controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;


@RestController
@RequestMapping("/mysql")
public class DemoController{
    @Autowired
    @Qualifier("userJdbcTemplate")
    private JdbcTemplate userJdbcTemplate;

    @Autowired
    @Qualifier("logJdbcTemplate")
    private JdbcTemplate logJdbcTemplate;

    @Autowired
    @Qualifier("valueUserJdbcTemplate")
    private JdbcTemplate valueUserJdbcTemplate;

    @Autowired
    @Qualifier("valueLogJdbcTemplate")
    private JdbcTemplate valueLogJdbcTemplate;

    @GetMapping("/test")
    public void test(){
        List> users = userJdbcTemplate.queryForList("select * from user");
        List> logs = logJdbcTemplate.queryForList("select * from user_log");
        users.forEach(a->{
            System.out.println(a);
        });
        System.out.println("--------分割线-----------");
        logs.forEach(a->{
            System.out.println(a);
        });
    }

    @GetMapping("/testvalue")
    public void testvalue(){
        List> users = valueUserJdbcTemplate.queryForList("select * from user");
        List> logs = valueLogJdbcTemplate.queryForList("select * from user_log");
        users.forEach(a->{
            System.out.println(a);
        });
        System.out.println("--------分割线-----------");
        logs.forEach(a->{
            System.out.println(a);
        });
    }
}

浏览器访问testvalue

springboot配置多个数据源_第1张图片

springboot配置多个数据源_第2张图片

浏览器访问test结果一致

遇到问题

问题:我使用springboot版本2.0.3的发现报错 发现三个bean,两个是定义的datasourceproperties,另一个是spring.datasource-org.springframework.boot.autoconfigure.jdbc.datasourceproperties 

原因:这可能是因为在Spring Boot 2.0.x版本中,DataSourceProperties类被定义在了不同的包中。然而,在Spring Boot 3.0.X版本中,该问题已经得到解决。

解决:如果使用的是2.x的版本,配置可以使用spring.datasource前缀覆盖自己配置的数据库连接信息,或者在启动类上直接排除自动配置(推荐,因为数据源比较多时,覆盖比较繁琐)

只想使用自定义的数据源配置,可以通过在启动类上使用@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})来排除Spring Boot的默认数据源自动配置。

你可能感兴趣的:(基础,spring,boot,java,spring)