最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

概述

Spring Boot 應(yīng)用程序的典型場景是將數(shù)據(jù)存儲在單個(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í),我們希望使用如下所示的存儲庫,其中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í)可能會出現(xiàn)陷阱,但最終這是可能的。 

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解析Spring Data JPA的Audit功能之審計(jì)數(shù)據(jù)庫變更

    解析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 onfiguration的使用

    本文主要介紹了SpringBoot四大神器之Auto Configuration,springboot auto configuration的本質(zhì)就是自動(dòng)配置spring的各種bean。感興趣的可以了解一下
    2021-10-10
  • 詳解SpringBoot中使用RabbitMQ的RPC功能

    詳解SpringBoot中使用RabbitMQ的RPC功能

    這篇文章主要介紹了詳解SpringBoot中使用RabbitMQ的RPC功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Java中LinkedList的模擬實(shí)現(xiàn)

    Java中LinkedList的模擬實(shí)現(xiàn)

    本文主要介紹了Java中LinkedList的模擬實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • idea如何將指定目錄打成jar包

    idea如何將指定目錄打成jar包

    這篇文章主要介紹了idea如何將指定目錄打成jar包問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java線程池對象ThreadPoolExecutor的深入講解

    java線程池對象ThreadPoolExecutor的深入講解

    在我們的開發(fā)中“池”的概念并不罕見,有數(shù)據(jù)庫連接池、線程池、對象池、常量池等等。下面這篇文章主要給大家介紹了關(guān)于java線程池對象ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-09-09
  • 使用Spring Batch實(shí)現(xiàn)批處理任務(wù)的詳細(xì)教程

    使用Spring Batch實(shí)現(xiàn)批處理任務(wù)的詳細(xì)教程

    在企業(yè)級應(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)的檢測

    這篇文章主要介紹了如何在?Java?中實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-04-04
  • JAVA映射實(shí)體類對象和List使用詳解

    JAVA映射實(shí)體類對象和List使用詳解

    文章主要內(nèi)容介紹Java中實(shí)體類對象與List的映射方法,核心代碼示例展示了如何將單個(gè)對象和List映射到實(shí)體類中,作者分享了個(gè)人經(jīng)驗(yàn),并鼓勵(lì)讀者參考和點(diǎn)贊支持
    2026-01-01
  • Java中LinkedHashSet、LinkedHashMap源碼詳解

    Java中LinkedHashSet、LinkedHashMap源碼詳解

    這篇文章主要介紹了Java中LinkedHashSet、LinkedHashMap源碼詳解,LinkedHashMap是一個(gè)以雙向鏈表的方式將Entry節(jié)點(diǎn)鏈接起來的HashMap子類,它在HashMap的基礎(chǔ)上實(shí)現(xiàn)了更多的功能,具有順序存儲和遍歷的特性,需要的朋友可以參考下
    2023-09-09

最新評論

晋州市| 亚东县| 千阳县| 古田县| 武功县| 大渡口区| 荃湾区| 鸡泽县| 博客| 翼城县| 迁安市| 甘孜| 灵石县| 闻喜县| 镇原县| 汉寿县| 嘉兴市| 通渭县| 兴山县| 西青区| 德保县| 神池县| 儋州市| 宝清县| 达州市| 阳城县| 确山县| 兰坪| 内黄县| 宕昌县| 拜泉县| 邵阳县| 宜兰县| 无锡市| 洪江市| 班玛县| 阜城县| 云梦县| 丰都县| 平利县| 客服|