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

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

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

引言

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

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

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

Spring Boot默認(rèn)通過(guò)DataSourceAutoConfiguration自動(dòng)配置單數(shù)據(jù)源。當(dāng)開(kāi)發(fā)者嘗試添加第二個(gè)數(shù)據(jù)源時(shí),以下問(wèn)題會(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)配置類通過(guò)條件注解控制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)級(jí)多數(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ù)源的原子性??鐜?kù)操作需要業(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ù)邊界明確?:通過(guò)@Qualifier和@Transactional屬性精確控制

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

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

相關(guān)文章

  • Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系

    Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系

    這篇文章主要介紹了Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • JDBC查詢Map轉(zhuǎn)對(duì)象實(shí)現(xiàn)過(guò)程詳解

    JDBC查詢Map轉(zhuǎn)對(duì)象實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了JDBC查詢Map轉(zhuǎn)對(duì)象實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中Lock鎖基本使用方法詳解

    Java中Lock鎖基本使用方法詳解

    鎖是一種工具,用于控制對(duì)共享資源的訪問(wèn)Lock和synchronized是最常見(jiàn)的兩個(gè)鎖,他們都能夠達(dá)到線程安全的目錄,這篇文章主要給大家介紹了關(guān)于Java中Lock鎖基本使用方法詳解的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • java 數(shù)據(jù)的加密與解密普遍實(shí)例代碼

    java 數(shù)據(jù)的加密與解密普遍實(shí)例代碼

    本篇文章介紹了一個(gè)關(guān)于密鑰查詢的jsp文件簡(jiǎn)單實(shí)例代碼,需要的朋友可以參考下
    2017-04-04
  • 關(guān)于SpringBoot配置文件加載位置的優(yōu)先級(jí)

    關(guān)于SpringBoot配置文件加載位置的優(yōu)先級(jí)

    這篇文章主要介紹了關(guān)于SpringBoot配置文件加載位置的優(yōu)先級(jí),我們也可以通過(guò)spring.config.location來(lái)改變默認(rèn)的配置文件位置,項(xiàng)目打包好后,我們可以通過(guò)命令行的方式在啟動(dòng)時(shí)指定配置文件的位置,需要的朋友可以參考下
    2023-10-10
  • SpringBoot邏輯異常統(tǒng)一處理方法

    SpringBoot邏輯異常統(tǒng)一處理方法

    這篇文章主要介紹了SpringBoot邏輯異常統(tǒng)一處理方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 繼承WebMvcConfigurationSupport后自動(dòng)配置不生效及如何配置攔截器

    繼承WebMvcConfigurationSupport后自動(dòng)配置不生效及如何配置攔截器

    這篇文章主要介紹了繼承WebMvcConfigurationSupport后自動(dòng)配置不生效及如何配置攔截器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳解如何在SpringBoot中實(shí)現(xiàn)優(yōu)雅關(guān)閉

    詳解如何在SpringBoot中實(shí)現(xiàn)優(yōu)雅關(guān)閉

    這篇文章主要介紹了如何在SpringBoot中實(shí)現(xiàn)優(yōu)雅關(guān)閉,SpringBoot應(yīng)用程序的關(guān)閉可以是崩潰,也可以是手動(dòng)關(guān)閉的,Shutdown、Crash 和 Graceful 之間的區(qū)別在于,它控制決定了我們可以用這個(gè)事件做什么,本文中,一起研究下Spring Boot提供的開(kāi)箱即用功能之一:優(yōu)雅關(guān)閉
    2024-09-09
  • 解決Swagger2返回map復(fù)雜結(jié)構(gòu)不能解析的問(wèn)題

    解決Swagger2返回map復(fù)雜結(jié)構(gòu)不能解析的問(wèn)題

    這篇文章主要介紹了解決Swagger2返回map復(fù)雜結(jié)構(gòu)不能解析的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java高并發(fā)BlockingQueue重要的實(shí)現(xiàn)類詳解

    Java高并發(fā)BlockingQueue重要的實(shí)現(xiàn)類詳解

    這篇文章主要給大家介紹了關(guān)于Java高并發(fā)BlockingQueue重要的實(shí)現(xiàn)類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論

双牌县| 蕲春县| 拜城县| 杨浦区| 涟水县| 吉安市| 安化县| 九龙县| 兴化市| 内乡县| 沁源县| 扶风县| 茂名市| 扎鲁特旗| 巴林右旗| 榆社县| 河西区| 阜南县| 马关县| 茶陵县| 鄂尔多斯市| 勐海县| 榆林市| 水富县| 怀安县| 阿拉善盟| 木兰县| 孝义市| 砚山县| 甘谷县| 达州市| 霍邱县| 星子县| 廉江市| 三江| 屏南县| 新疆| 岳阳县| 呼和浩特市| 万荣县| 武城县|