在SpringBoot中配置和使用多個(gè)數(shù)據(jù)源方式
概述
Spring Boot 應(yīng)用程序的典型場景是將數(shù)據(jù)存儲(chǔ)在單個(gè)關(guān)系數(shù)據(jù)庫中。但有時(shí)我們需要訪問多個(gè)數(shù)據(jù)庫。
在本教程中,我們將學(xué)習(xí)如何使用 Spring Boot 配置和使用多個(gè)數(shù)據(jù)源。

默認(rèn)行為
讓我們回憶一下在 Spring Boot 中在application.yml中聲明數(shù)據(jù)源的樣子:
spring:
datasource:
url: ...
username: ...
password: ...
driverClassname: ... 在內(nèi)部,Spring 將這些設(shè)置映射到org.springframework.boot.autoconfigure.jdbc.DataSourceProperties的實(shí)例。
讓我們看一下實(shí)現(xiàn)過程:
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
// ...
/**
* Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
*/
private String driverClassName;
/**
* JDBC URL of the database.
*/
private String url;
/**
* Login username of the database.
*/
private String username;
/**
* Login password of the database.
*/
private String password;
// ...
}我們應(yīng)該指出@ConfigurationProperties注釋,它自動(dòng)將配置的屬性映射到Java對象。
擴(kuò)展默認(rèn)值
因此,要使用多個(gè)數(shù)據(jù)源,我們需要在 Spring 的應(yīng)用程序上下文中聲明具有不同映射的多個(gè) bean。
我們可以通過使用配置類來實(shí)現(xiàn)這一點(diǎn):
@Configuration
public class TodoDatasourceConfiguration {
@Bean
@ConfigurationProperties("spring.datasource.todos")
public DataSourceProperties todosDataSourceProperties() {
return new DataSourceProperties();
}
}
@Configuration
public class TopicDatasourceConfiguration {
@Bean
@ConfigurationProperties("spring.datasource.topics")
public DataSourceProperties topicsDataSourceProperties() {
return new DataSourceProperties();
}
}數(shù)據(jù)源的配置必須如下所示:
spring:
datasource:
todos:
url: ...
username: ...
password: ...
driverClassName: ...
topics:
url: ...
username: ...
password: ...
driverClassName: ... 然后我們可以使用DataSourceProperties對象創(chuàng)建數(shù)據(jù)源:
@Bean
public DataSource todosDataSource() {
return todosDataSourceProperties()
.initializeDataSourceBuilder()
.build();
}
@Bean
public DataSource topicsDataSource() {
return topicsDataSourceProperties()
.initializeDataSourceBuilder()
.build();
}Spring Data JDBC
使用 Spring Data JDBC 時(shí),我們還需要為每個(gè)DataSource配置一個(gè)JdbcTemplate實(shí)例:
@Bean
public JdbcTemplate todosJdbcTemplate(@Qualifier("todosDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean
public JdbcTemplate topicsJdbcTemplate(@Qualifier("topicsDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}然后我們也可以通過指定@Qualifier來使用它們:
@Autowired
@Qualifier("topicsJdbcTemplate")
JdbcTemplate jdbcTemplate; Spring Data JPA
當(dāng)使用 Spring Data JPA 時(shí),我們希望使用如下所示的存儲(chǔ)庫,其中Todo是實(shí)體:
public interface TodoRepository extends JpaRepository<Todo, Long> {} 因此,我們需要為每個(gè)數(shù)據(jù)源聲明EntityManager工廠:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackageClasses = Todo.class,
entityManagerFactoryRef = "todosEntityManagerFactory",
transactionManagerRef = "todosTransactionManager"
)
public class TodoJpaConfiguration {
@Bean
public LocalContainerEntityManagerFactoryBean todosEntityManagerFactory(
@Qualifier("todosDataSource") DataSource dataSource,
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(dataSource)
.packages(Todo.class)
.build();
}
@Bean
public PlatformTransactionManager todosTransactionManager(
@Qualifier("todosEntityManagerFactory") LocalContainerEntityManagerFactoryBean todosEntityManagerFactory) {
return new JpaTransactionManager(Objects.requireNonNull(todosEntityManagerFactory.getObject()));
}
} 讓我們看看我們應(yīng)該注意的一些限制。
我們需要拆分包以允許每個(gè)數(shù)據(jù)源使用一個(gè)@EnableJpaRepositories 。
不幸的是,為了注入EntityManagerFactoryBuilder,我們需要將其中一個(gè)數(shù)據(jù)源聲明為@Primary。
這是因?yàn)镋ntityManagerFactoryBuilder是在org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration中聲明的,而該類只需要注入單個(gè)數(shù)據(jù)源。通常,框架的某些部分可能不需要配置多個(gè)數(shù)據(jù)源。
配置 Hikari 連接池
如果我們想要配置Hikari,我們只需要在數(shù)據(jù)源定義中添加@ConfigurationProperties :
@Bean
@ConfigurationProperties("spring.datasource.todos.hikari")
public DataSource todosDataSource() {
return todosDataSourceProperties()
.initializeDataSourceBuilder()
.build();
}然后我們可以將以下幾行插入到application.properties文件中:
spring.datasource.todos.hikari.connectionTimeout=30000 spring.datasource.todos.hikari.idleTimeout=600000 spring.datasource.todos.hikari.maxLifetime=1800000
結(jié)論
在本文中,我們學(xué)習(xí)了如何使用 Spring Boot 配置多個(gè)數(shù)據(jù)源。
我們發(fā)現(xiàn)我們需要一些配置,并且偏離標(biāo)準(zhǔn)時(shí)可能會(huì)出現(xiàn)陷阱,但最終這是可能的。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot動(dòng)態(tài)配置數(shù)據(jù)源的三種實(shí)現(xiàn)方式
- SpringBoot + Druid + Dynamic Datasource 多數(shù)據(jù)源配置方案
- SpringBoot項(xiàng)目中多數(shù)據(jù)源配置方法與使用場景
- SpringBoot實(shí)現(xiàn)Redis多數(shù)據(jù)庫切換(多數(shù)據(jù)源配置)
- SpringBoot進(jìn)行多數(shù)據(jù)源配置的詳細(xì)步驟
- SpringBoot+MybatisPlus+jdbc連接池配置多數(shù)據(jù)源的實(shí)現(xiàn)
- SpringBoot多數(shù)據(jù)源配置的終極解決方案
相關(guān)文章
解析Spring Data JPA的Audit功能之審計(jì)數(shù)據(jù)庫變更
Spring Data JPA 提供了Audit審計(jì)功能,用來記錄創(chuàng)建時(shí)間、創(chuàng)建人、修改時(shí)間、修改人等,下面來詳細(xì)講解下審計(jì)數(shù)據(jù)庫變更2021-06-06
SpringBoot四大神器之Auto onfiguration的使用
本文主要介紹了SpringBoot四大神器之Auto Configuration,springboot auto configuration的本質(zhì)就是自動(dòng)配置spring的各種bean。感興趣的可以了解一下2021-10-10
Java中LinkedList的模擬實(shí)現(xiàn)
本文主要介紹了Java中LinkedList的模擬實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
java線程池對象ThreadPoolExecutor的深入講解
在我們的開發(fā)中“池”的概念并不罕見,有數(shù)據(jù)庫連接池、線程池、對象池、常量池等等。下面這篇文章主要給大家介紹了關(guān)于java線程池對象ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧2018-09-09
使用Spring Batch實(shí)現(xiàn)批處理任務(wù)的詳細(xì)教程
在企業(yè)級(jí)應(yīng)用中,批處理任務(wù)是不可或缺的一部分,它們通常用于處理大量數(shù)據(jù),如數(shù)據(jù)遷移、數(shù)據(jù)清洗、生成報(bào)告等,Spring Batch是Spring框架的一部分,本文將介紹如何使用Spring Batch與SpringBoot結(jié)合,構(gòu)建和管理批處理任務(wù),需要的朋友可以參考下2024-06-06
基于Java實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測
這篇文章主要介紹了如何在?Java?中實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2022-04-04
Java中LinkedHashSet、LinkedHashMap源碼詳解
這篇文章主要介紹了Java中LinkedHashSet、LinkedHashMap源碼詳解,LinkedHashMap是一個(gè)以雙向鏈表的方式將Entry節(jié)點(diǎn)鏈接起來的HashMap子類,它在HashMap的基礎(chǔ)上實(shí)現(xiàn)了更多的功能,具有順序存儲(chǔ)和遍歷的特性,需要的朋友可以參考下2023-09-09

