【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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM