【SpringBoot】如何在Springboot应用中实现双数据源配置(多数据源也是一样方法,附例程下载)

本文例程:https://files.cnblogs.com/files/heyang78/multiDataSource_211109.rar

本文基于SpringBoot 2.5.4 和Orcale19c,文中提到的双数据源将以两个不同账户来实现,其中luna账户用于供程序运转,system账户用于备份。

 

现在一个应用带多个数据源并不罕见,比如下文将要提到的一主一丛配置,第一数据源用于程序运作,第二数据源主要用于备份。

SpringBoot程序要实现双数据源以致多数据源并不难,主要分两步:在配置文件中定义及在配置类中声明。

首先看文件application-dev.yml中的定义部分:

复制代码
server:
    port: 8080
myenv:
    name: '开发环境'   
spring: 
    datasource:
        primary:
            jdbc-url: jdbc:oracle:thin:@127.0.0.1:1521:orclhy78
            username: luna
            password: 1234
            driver-class-name: oracle.jdbc.OracleDriver
            type: com.zaxxer.hikari.HikariDataSource
        secondary:
            jdbc-url: jdbc:oracle:thin:@127.0.0.1:1521:orclhy78
            username: system
            password: 123456
            driver-class-name: oracle.jdbc.OracleDriver
            type: com.zaxxer.hikari.HikariDataSource
复制代码

上面粗体部分就是定义两个数据源,primary和secondary是我起的名字,您也可以选择自己的个性命名。但其它照着来就好。

 

再就是配置类:

复制代码
import javax.sql.DataSource;

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 com.zaxxer.hikari.HikariDataSource;

@Configuration
public class DataSourceConfig {
    @ConfigurationProperties(prefix="spring.datasource.primary")
    @Bean("primaryOracleDs")
    @Primary
    public DataSource getPrimaryDs() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }
    
    @ConfigurationProperties(prefix="spring.datasource.secondary")
    @Bean("secondaryOracleDs")
    public DataSource getSecondaryDs() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }
}
复制代码

这个配了两个数据源,第一个加上Primary标识是告诉系统,你要的DataSource就是我,不是别的。系统装载默认数据源会去找所有DataSource的bean,@Primary就是告诉系统在发现多个时如何进行取舍的。

这两部完成了也就完事了,有些同学会问如何用备份数据源呢,别急,下面准备好了测试程序教你:

复制代码
import java.sql.SQLException;

import javax.sql.DataSource;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
class MyApplicationTests {
    @Value("${server.port}")
    private String serverPort;
    
    @Value("${myenv.name}")
    private String myenvName;
    
    // 因为有@primary标识,这个系统缺省数据源会载入spring.datasource.primary指代的数据源
    @Autowired
    private DataSource systemDefaultDs;
    
    // 因为DataSource类已经被标识了@Primary的bean占据,备份数据源要注入seondary必须指定名字
    // 也就是有@Bean("secondaryOracleDs")标识的那一个
    @Autowired
    @Qualifier("secondaryOracleDs")
    private DataSource backupDs;
    
    @Test
    void test_systemDefaultDs() throws SQLException {
        System.out.println("系统缺省数据源的schema="+systemDefaultDs.getConnection().getSchema());
    }
    
    @Test
    void test_backupDs() throws SQLException {
        System.out.println("备份数据源的schema="+backupDs.getConnection().getSchema());
    }
    
    @Test
    void contextLoads() {
    }

    @Test
    void testEnvironment() {
        System.out.println("myenvName="+myenvName);
        System.out.println("serverPort="+serverPort);
    }
    
    
}
复制代码

上面的注入方法写得很清楚了,运行Junit测试一下看看:

备份数据源的schema=SYSTEM
2021-11-09 20:19:36.674  INFO 36464 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Starting...
2021-11-09 20:19:36.729  INFO 36464 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Start completed.
系统缺省数据源的schema=LUNA

这个结果说明两个数据源都能正常运转了。

如果需要把这些数据源注入到list中备用,可以这样做:

@Autowired
private List<DataSource> dsList;

如果需要指定顺序,可以在添加@Order(2)标签,如:

复制代码
    @ConfigurationProperties(prefix="spring.datasource.primary")
    @Bean("primaryOracleDs")
    @Primary
    @Order(1)
    public DataSource getPrimaryDs() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }
    
    @ConfigurationProperties(prefix="spring.datasource.secondary")
    @Bean("secondaryOracleDs")
    @Order(2)
    public DataSource getSecondaryDs() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }
复制代码

好了,就到这里,希望本文能帮助到有需要的同学。

END

 

posted @   逆火狂飙  阅读(1067)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2019-11-09 【Oracle】往Oracle11g的某表插入近千万条记录,耗时略超一小时
2019-11-09 【Oracle/Java】向三张表各插入百万数据,共用时18分3秒,平均每张表6分钟
2019-11-09 【Oracle】创建用户及设定权限
2019-11-09 【DOS】取某目录下某类型文件信息放入文本
2019-11-09 Oralce JDBC jar包下载
2019-11-09 【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒
2017-11-09 【Canvas与艺术】蓝盾红带白星
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示