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

SpringBoot多數(shù)據(jù)源配置的終極解決方案

 更新時(shí)間:2025年05月21日 10:47:41   作者:悟能不能悟  
在微服務(wù)架構(gòu)和復(fù)雜業(yè)務(wù)場景中,一個(gè)Spring?Boot應(yīng)用連接多個(gè)數(shù)據(jù)庫的需求日益普遍,本文將深入剖析Spring?Boot自動(dòng)配置的底層邏輯,揭示多數(shù)據(jù)源場景下的典型陷阱,并提供一套生產(chǎn)級解決方案,希望對大家有一定的幫助

引言

在微服務(wù)架構(gòu)和復(fù)雜業(yè)務(wù)場景中,一個(gè)Spring Boot應(yīng)用連接多個(gè)數(shù)據(jù)庫的需求日益普遍。許多開發(fā)者嘗試通過簡單復(fù)制單數(shù)據(jù)源配置來實(shí)現(xiàn)多數(shù)據(jù)源,結(jié)果卻遭遇了Bean沖突、事務(wù)失效、連接泄漏等隱蔽問題。本文將深入剖析Spring Boot自動(dòng)配置的底層邏輯,揭示多數(shù)據(jù)源場景下的典型陷阱,并提供一套生產(chǎn)級解決方案。

一、為什么簡單的多數(shù)據(jù)源配置會(huì)失敗

1. Spring Boot的自動(dòng)配置陷阱

Spring Boot默認(rèn)通過DataSourceAutoConfiguration自動(dòng)配置單數(shù)據(jù)源。當(dāng)開發(fā)者嘗試添加第二個(gè)數(shù)據(jù)源時(shí),以下問題會(huì)突然爆發(fā):

// 典型錯(cuò)誤配置方式
@Bean
public DataSource dataSource1() { /* 配置1 */ }
 
@Bean
public DataSource dataSource2() { /* 配置2 */ }
 
// 啟動(dòng)時(shí)報(bào)錯(cuò):
// No qualifying bean of type 'javax.sql.DataSource' available: 
// expected single matching bean but found 2

2. 事務(wù)管理的"薛定諤狀態(tài)"

即使成功注入數(shù)據(jù)源,未正確配置的事務(wù)管理器會(huì)導(dǎo)致:

  • 跨數(shù)據(jù)源操作缺乏原子性
  • @Transactional注解神秘失效
  • 部分操作不回滾

二、多數(shù)據(jù)源配置的核心矛盾

1. 自動(dòng)配置的"霸道"行為

Spring Boot的自動(dòng)配置類通過條件注解控制Bean創(chuàng)建:

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(DataSource.class) // 關(guān)鍵點(diǎn)!
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration { ... }

當(dāng)手動(dòng)聲明多個(gè)DataSource時(shí),?自動(dòng)配置被禁用,但相關(guān)組件(如JdbcTemplate)仍依賴默認(rèn)數(shù)據(jù)源。

2. 事務(wù)管理器的"獨(dú)占性"

PlatformTransactionManager默認(rèn)綁定主數(shù)據(jù)源,多數(shù)據(jù)源需要獨(dú)立的事務(wù)管理器:

@Bean
@Primary // 必須明確指定主事務(wù)管理器
public PlatformTransactionManager txManager1(DataSource dataSource1) {
    return new DataSourceTransactionManager(dataSource1);
}

三、生產(chǎn)級多數(shù)據(jù)源配置方案

步驟1:禁用默認(rèn)數(shù)據(jù)源自動(dòng)配置

@SpringBootApplication(exclude = {
    DataSourceAutoConfiguration.class,
    DataSourceTransactionManagerAutoConfiguration.class,
    JdbcTemplateAutoConfiguration.class
})
public class MultiDataSourceApp { ... }

步驟2:手動(dòng)定義所有數(shù)據(jù)源

# application.yml
primary:
  datasource:
    url: jdbc:mysql://primary/db
    username: admin
    password: pwd123
secondary:
  datasource:
    url: jdbc:mysql://secondary/db
    username: reader
    password: read123
@Configuration
public class DataSourceConfig {
 
    // 主數(shù)據(jù)源(必須標(biāo)記@Primary)
    @Bean(name = "primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "primary.datasource")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
 
    // 從數(shù)據(jù)源
    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "secondary.datasource")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

步驟3:為每個(gè)數(shù)據(jù)源配置獨(dú)立的事務(wù)管理器

@Configuration
public class TransactionManagerConfig {
 
    @Bean(name = "primaryTransactionManager")
    @Primary
    public PlatformTransactionManager primaryTxManager(
            @Qualifier("primaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager secondaryTxManager(
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

步驟4:定制化JdbcTemplate

@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(
        @Qualifier("primaryDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}
 
@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(
        @Qualifier("secondaryDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

四、多數(shù)據(jù)源事務(wù)的進(jìn)階控制

1. 分布式事務(wù)的偽命題

在未引入Seata等中間件的情況下,Spring的@Transactional只能保證單個(gè)數(shù)據(jù)源的原子性??鐜觳僮餍枰獦I(yè)務(wù)層補(bǔ)償機(jī)制。

2. 事務(wù)傳播的精確控制

// 明確指定使用哪個(gè)事務(wù)管理器
@Transactional(value = "secondaryTransactionManager", 
               propagation = Propagation.REQUIRES_NEW)
public void batchInsert() {
    // 使用secondary數(shù)據(jù)源執(zhí)行操作
}

五、性能優(yōu)化與監(jiān)控

1. 連接池參數(shù)調(diào)優(yōu)

@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "primary.datasource.hikari")
public DataSource primaryDataSource() {
    return DataSourceBuilder.create()
           .type(HikariDataSource.class).build();
}
 
// application.yml
primary:
  datasource:
    hikari:
      maximum-pool-size: 20
      connection-timeout: 3000

2. 監(jiān)控指標(biāo)暴露

@Bean
public DataSourcePoolMetrics primaryDataSourceMetrics(
        @Qualifier("primaryDataSource") DataSource dataSource) {
    return new DataSourcePoolMetrics(dataSource, 
           "primary", Tags.empty());
}

六、總結(jié)與最佳實(shí)踐

?嚴(yán)格隔離配置?:每個(gè)數(shù)據(jù)源的屬性前綴、Bean名稱、事務(wù)管理器都要清晰隔離

?顯式排除自動(dòng)配置?:避免殘留配置造成沖突

?事務(wù)邊界明確?:通過@Qualifier和@Transactional屬性精確控制

?監(jiān)控先行?:配置連接池監(jiān)控,預(yù)防泄漏和性能瓶頸

到此這篇關(guān)于SpringBoot多數(shù)據(jù)源配置的終極解決方案的文章就介紹到這了,更多相關(guān)SpringBoot多數(shù)據(jù)源配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java聊天室之實(shí)現(xiàn)一個(gè)服務(wù)器與多個(gè)客戶端通信

    Java聊天室之實(shí)現(xiàn)一個(gè)服務(wù)器與多個(gè)客戶端通信

    這篇文章主要為大家詳細(xì)介紹了Java簡易聊天室之實(shí)現(xiàn)一個(gè)服務(wù)器與多個(gè)客戶端通信,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下
    2022-10-10
  • Java中sharding-jdbc按年月分片的示例代碼

    Java中sharding-jdbc按年月分片的示例代碼

    本文主要介紹了Java中sharding-jdbc按年月分片的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 類添加注解@RequestMapping報(bào)錯(cuò)HTTP Status 404的解決

    類添加注解@RequestMapping報(bào)錯(cuò)HTTP Status 404的解決

    這篇文章主要介紹了類添加注解@RequestMapping報(bào)錯(cuò)HTTP Status 404的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過程

    mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過程

    這篇文章主要介紹了mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 如何通過Java生成一個(gè)隨機(jī)數(shù)

    如何通過Java生成一個(gè)隨機(jī)數(shù)

    當(dāng)我們需要在Java中生成隨機(jī)數(shù)時(shí),可以借助JDK中提供的Random類來實(shí)現(xiàn),通過使用Random類,我們可以輕松地生成各種類型的隨機(jī)數(shù),下面我們就來看看如何利用Random類生成隨機(jī)數(shù)吧
    2023-09-09
  • SpringCloud的Config配置中心詳解

    SpringCloud的Config配置中心詳解

    這篇文章主要介紹了SpringCloud的Config配置中心詳解,SpringCloud Config為微服務(wù)架構(gòu)中的微服務(wù)提供集中化的外部配置支持,配置服務(wù)器為各個(gè)不同微服務(wù)應(yīng)用的所有環(huán)境提供了一個(gè)中心化的外部配置,需要的朋友可以參考下
    2023-07-07
  • Java servlet通過事件驅(qū)動(dòng)進(jìn)行高性能長輪詢詳解

    Java servlet通過事件驅(qū)動(dòng)進(jìn)行高性能長輪詢詳解

    這篇文章主要介紹了基于servlet3.0+事件驅(qū)動(dòng)實(shí)現(xiàn)高性能長輪詢的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2022-06-06
  • Java的Shiro框架認(rèn)證流程詳解

    Java的Shiro框架認(rèn)證流程詳解

    這篇文章主要介紹了Java的Shiro框架認(rèn)證流程詳解,Shiro 是一個(gè)功能強(qiáng)大和易于使用的安全框架,為開發(fā)人員提供一個(gè)直觀而全面的解決方案的認(rèn)證,授權(quán),加密,會(huì)話管理四大功能,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)字符串轉(zhuǎn)為駝峰格式的方法詳解

    Java實(shí)現(xiàn)字符串轉(zhuǎn)為駝峰格式的方法詳解

    這篇文章主要介紹了如何利用Java語言實(shí)現(xiàn)字符串轉(zhuǎn)為駝峰格式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Mybatis實(shí)現(xiàn)自定義類型轉(zhuǎn)換器TypeHandler的方法

    Mybatis實(shí)現(xiàn)自定義類型轉(zhuǎn)換器TypeHandler的方法

    Mybatis實(shí)現(xiàn)自定義的轉(zhuǎn)換器非常的簡單,只需要三步就可以實(shí)現(xiàn)自定義類型轉(zhuǎn)換器TypeHandler,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-07-07

最新評論