欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在SpringBoot中配置和使用多個(gè)數(shù)據(jù)源方式

 更新時(shí)間:2025年08月25日 11:17:07   作者:csdn_aspnet  
本文介紹如何在Spring?Boot中配置多數(shù)據(jù)源,需通過配置類聲明不同數(shù)據(jù)源bean,使用@ConfigurationProperties映射屬性,并針對(duì)SpringDataJDBC和JPA分別配置JdbcTemplate與EntityManagerFactory,注意拆分包及@Primary注解的使用,同時(shí)可配置Hikari連接池

概述

Spring Boot 應(yīng)用程序的典型場(chǎ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對(duì)象。 

擴(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對(duì)象創(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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文詳解gRPC快速整合SpringCloud

    一文詳解gRPC快速整合SpringCloud

    這篇文章主要為大家介紹gRPC快速整合SpringCloud的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的區(qū)別及在springboot常用地方

    解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstr

    這篇文章主要介紹了解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的區(qū)別及在springboot常用地方,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java異常架構(gòu)和異常關(guān)鍵字圖文詳解

    Java異常架構(gòu)和異常關(guān)鍵字圖文詳解

    Java異常是Java提供的一種識(shí)別及響應(yīng)錯(cuò)誤的一致性機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Java異常架構(gòu)和異常關(guān)鍵字的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 圖文詳解Java線程和線程池

    圖文詳解Java線程和線程池

    下面小編就為大家?guī)硪黄斦凧ava的線程和線程池。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-11-11
  • Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法示例

    Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法示例

    這篇文章主要介紹了Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法,結(jié)合實(shí)例形式詳細(xì)分析了Java使用BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類進(jìn)行數(shù)值運(yùn)算與日期運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Java中定時(shí)任務(wù)的6種實(shí)現(xiàn)方式

    Java中定時(shí)任務(wù)的6種實(shí)現(xiàn)方式

    這篇文章主要給大家分享的是Java中定時(shí)任務(wù)的6種實(shí)現(xiàn)方式,幾乎在所有的項(xiàng)目中,定時(shí)任務(wù)的使用都是不可或缺的,如果使用不當(dāng)甚至?xí)斐少Y損,下面文章我們就來看看Java中定時(shí)任務(wù)的具體使用方式吧
    2021-10-10
  • 看動(dòng)畫學(xué)算法之Java實(shí)現(xiàn)doublyLinkedList

    看動(dòng)畫學(xué)算法之Java實(shí)現(xiàn)doublyLinkedList

    這篇文章主要介紹Java實(shí)現(xiàn)doublyLinkedList,LinkedList:doublyLinkedList相對(duì)比較復(fù)雜,今天就來簡(jiǎn)單學(xué)習(xí)一下doublyLinkedList的基本操作和概,感興趣的小伙伴可以參考下面具體文章內(nèi)容
    2021-10-10
  • springboot webflux 過濾器(使用RouterFunction實(shí)現(xiàn))

    springboot webflux 過濾器(使用RouterFunction實(shí)現(xiàn))

    這篇文章主要介紹了springboot webflux 過濾器(使用RouterFunction實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(1)

    JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(1)

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)第一篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java警告:源發(fā)行版17 需要目標(biāo)發(fā)行版17問題及解決

    java警告:源發(fā)行版17 需要目標(biāo)發(fā)行版17問題及解決

    文章介紹了如何解決項(xiàng)目JDK版本不一致的問題,包括修改Project Structure、Modules、Dependencies和Settings中的JDK版本,以及在pom.xml中指定JDK源版本
    2024-11-11

最新評(píng)論