Spring Boot配置多個DataSource


使用Spring Boot時,默認情況下,配置DataSource非常容易。Spring Boot會自動為我們配置好一個DataSource

如果在application.yml中指定了spring.datasource的相關配置,Spring Boot就會使用該配置創建一個DataSource。如果在application.yml中沒有指定任何spring.datasource的相關配置,Spring Boot會在classpath中搜索H2、hsqldb等內存數據庫的jar包,如果找到了,就會自動配置一個內存數據庫的DataSource,所以,我們只要引入jar包即可。例如,配置一個hsqldb數據源:

<dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope> </dependency> 

但是,在某些情況下,如果我們需要配置多個數據源,應該如何在Spring Boot中配置呢?

我們以JDBC為例,演示如何在Spring Boot中配置兩個DataSource。對應的,我們會創建兩個JdbcTemplate的Bean,分別使用這兩個數據源。

首先,我們必須在application.yml中聲明兩個數據源的配置,一個使用spring.datasource,另一個使用spring.second-datasource

spring: application: name: data-multidatasource datasource: driver-class-name: org.hsqldb.jdbc.JDBCDriver url: jdbc:hsqldb:mem:db1 username: sa password: second-datasource: driver-class-name: org.hsqldb.jdbc.JDBCDriver url: jdbc:hsqldb:mem:db2 username: sa password: 

這兩個DataSource都使用hsqldb,但是數據庫是不同的。此外,在使用多數據源的時候,所有必要配置都不能省略。

其次,我們需要自己創建兩個DataSource的Bean,其中一個標記為@Primary,另一個命名為secondDatasource

@Configuration public class SomeConfiguration { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondDatasource") @ConfigurationProperties(prefix = "spring.second-datasource") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } } 

對於每一個DataSource,我們都必須通過@ConfigurationProperties(prefix = "xxx")指定配置項的前綴。

緊接着,我們創建兩個JdbcTemplate的Bean,其中一個標記為@Primary,另一個命名為secondJdbcTemplate,分別使用對應的DataSource

@Bean @Primary public JdbcTemplate primaryJdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondJdbcTemplate") public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDatasource") DataSource dataSource) { return new JdbcTemplate(dataSource); } 

注意到secondJdbcTemplate在創建時,傳入的DataSource必須用@Qualifier("secondDatasource")聲明,這樣,才能使用第二個DataSource

現在,我們就創建了兩個JdbcTemplateBean。在需要使用第一個JdbcTemplate的地方,我們直接注入:

@Component public class SomeService { @Autowired JdbcTemplate jdbcTemplate; } 

在需要使用第二個JdbcTemplate的地方,我們注入時需要用@Qualifier("secondJdbcTemplate")標識:

@Component public class AnotherService { @Autowired @Qualifier("secondJdbcTemplate") JdbcTemplate secondJdbcTemplate; } 

這樣,我們就可以針對不同的數據源,用不同的JdbcTemplate進行操作。

注意事項

當存在多個相同類型的Bean,例如,多個DataSource,多個JdbcTemplate時,強烈建議總是使用@Primary把其中某一個Bean標識為“主要的”,使用@Autowired注入時會首先使用被標記為@Primary的Bean。

相同類型的其他Bean,每一個都需要用@Bean(name="xxx")標識名字,並且,在使用@Autowired注入時配合@Qualifier("xxx")指定注入的Bean的名字

完整的示例工程源碼請參考:

https://github.com/michaelliao/springcloud/tree/master/data-multidatasource


免責聲明!

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



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