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

SpringBoot使用Druid連接池進(jìn)行優(yōu)化完整指南

 更新時(shí)間:2025年07月22日 08:19:09   作者:奇妙智能  
在 Spring Boot 中使用 Druid 連接池進(jìn)行極致優(yōu)化,需要從??核心參數(shù)調(diào)優(yōu)??,??監(jiān)控體系搭建,??安全增強(qiáng)??等多個(gè)維度綜合考慮,下面是詳細(xì)優(yōu)化策略,希望對大家有所幫助

在 Spring Boot 中使用 Druid 連接池進(jìn)行極致優(yōu)化,需要從??核心參數(shù)調(diào)優(yōu)??、??監(jiān)控體系搭建??、??安全增強(qiáng)??、??連接管理??及??性能適配??等多個(gè)維度綜合考慮。以下是分階段的詳細(xì)優(yōu)化策略:

??一、基礎(chǔ)環(huán)境準(zhǔn)備??

確保使用最新穩(wěn)定版 Druid(截至 2024 年推薦 1.2.38+),并在 pom.xml 中排除舊版本依賴:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.38</version>
</dependency>

??二、核心連接池參數(shù)調(diào)優(yōu)??

Druid 的核心參數(shù)需根據(jù)??業(yè)務(wù)場景??(如 QPS、數(shù)據(jù)庫類型、硬件資源)動(dòng)態(tài)調(diào)整,以下為通用優(yōu)化模板:

1. 連接池容量控制

??initialSize??:初始連接數(shù)(默認(rèn) 0)。

建議設(shè)置為 CPU核心數(shù)/2(如 4 核設(shè)為 2),避免啟動(dòng)時(shí)大量創(chuàng)建連接的開銷。

??minIdle??:最小空閑連接數(shù)(關(guān)鍵!)。

需保證業(yè)務(wù)低峰期仍有足夠空閑連接,避免突發(fā)流量時(shí)頻繁創(chuàng)建連接。推薦值為 CPU核心數(shù)*1.5(如 4 核設(shè)為 6),但不超過數(shù)據(jù)庫最大連接限制(如 MySQL 默認(rèn) max_connections=151)。

??maxActive??:最大活躍連接數(shù)(核心?。?。

需結(jié)合數(shù)據(jù)庫性能和業(yè)務(wù)峰值 QPS 調(diào)整。經(jīng)驗(yàn)公式:maxActive = 數(shù)據(jù)庫單連接 QPS * 1.2(如單連接每秒處理 100 次 SQL,則設(shè)為 120)。
注意:若設(shè)置過大(如超過 200),可能導(dǎo)致數(shù)據(jù)庫連接數(shù)耗盡,引發(fā) Too many connections 錯(cuò)誤。

2. 連接生命周期管理

??maxWait??:獲取連接的最大等待時(shí)間(毫秒,默認(rèn) -1 無限制)。

建議設(shè)置為 3000ms(3 秒),避免線程長時(shí)間阻塞。配合監(jiān)控可快速發(fā)現(xiàn)連接池不足問題。

??timeBetweenEvictionRunsMillis??:連接池后臺(tái)檢測線程的執(zhí)行間隔(默認(rèn) 1 分鐘)。

推薦 10000ms(10 秒),縮短無效連接的回收周期,降低資源占用。

??minEvictableIdleTimeMillis??:連接在池中最小空閑時(shí)間(默認(rèn) 30 分鐘)。

若業(yè)務(wù)短連接為主(如 HTTP 請求),可縮短至 60000ms(1 分鐘),避免長空閑連接占用資源。

??validationQuery??:連接有效性校驗(yàn) SQL(默認(rèn)無)。

必須配置!推薦使用輕量級查詢(如 MySQL 的 SELECT 1,Oracle 的 SELECT 1 FROM DUAL),避免全表掃描。配合 testWhileIdle=true,僅在連接空閑時(shí)校驗(yàn),減少對數(shù)據(jù)庫的壓力。

??testWhileIdle/testOnBorrow/testOnReturn??:

  • testWhileIdle=true(推薦):空閑時(shí)校驗(yàn),平衡性能與可靠性。
  • testOnBorrow=false:借用時(shí)不校驗(yàn)(避免每次取連接都查庫)。
  • testOnReturn=false:歸還時(shí)不校驗(yàn)(同上)。

??三、監(jiān)控體系搭建(關(guān)鍵優(yōu)化點(diǎn))??

Druid 內(nèi)置強(qiáng)大的監(jiān)控功能,需通過配置暴露監(jiān)控指標(biāo),結(jié)合報(bào)警系統(tǒng)實(shí)現(xiàn)問題快速定位。

1. 開啟 StatFilter(SQL 統(tǒng)計(jì))

application.yml 中配置:

spring:
  datasource:
    druid:
      stat-filter:
        enabled: true
        # 慢 SQL 閾值(毫秒,默認(rèn) 0 不統(tǒng)計(jì))
        slow-sql-millis: 2000 
        # 是否記錄合并的 SQL(如批量操作)
        merge-sql: true 
        # 統(tǒng)計(jì)日志輸出間隔(毫秒,默認(rèn) 60000)
        log-slow-sql: true 
  • ??作用??:統(tǒng)計(jì) SQL 執(zhí)行次數(shù)、耗時(shí)、影響行數(shù),識(shí)別慢 SQL(如超過 2s 的查詢)。
  • ??擴(kuò)展??:可通過 @EnableWebMvc 暴露 /druid/statView.html 頁面查看統(tǒng)計(jì)(見下文 Web 監(jiān)控)。

2. 配置 Web 監(jiān)控頁面

spring:
  datasource:
    druid:
      web-stat-filter:
        enabled: true
        # 監(jiān)控所有請求(默認(rèn) /*)
        url-pattern: /*
        # 排除靜態(tài)資源(可選)
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        # 允許訪問的 IP(生產(chǎn)環(huán)境建議限制)
        allow: 127.0.0.1 
        # 登錄用戶名/密碼(生產(chǎn)環(huán)境必須設(shè)置)
        login-username: admin 
        login-password: 123456 
        # 禁用重置功能(安全增強(qiáng))
        reset-enable: false 
  • ??功能??:實(shí)時(shí)查看連接池狀態(tài)(活躍/空閑連接數(shù)、等待隊(duì)列長度)、SQL 執(zhí)行統(tǒng)計(jì)、URI 調(diào)用統(tǒng)計(jì)等。
  • ??注意??:生產(chǎn)環(huán)境需關(guān)閉公網(wǎng)訪問,僅允許運(yùn)維 IP 訪問,并啟用登錄認(rèn)證。

3. 日志集成(ELK 或 Prometheus+Grafana)

??ELK 方案??:通過 logback-spring.xml 配置 Druid 日志輸出到 Logstash,結(jié)合 Kibana 分析。

示例(記錄連接獲取耗時(shí)):

<logger name="com.alibaba.druid.pool.DruidDataSource" level="DEBUG">
    <appender-ref ref="LOGSTASH"/>
</logger>

??Prometheus+Grafana 方案??:使用 micrometer-registry-prometheusdruid-prometheus-exporter 暴露指標(biāo),通過 Grafana 可視化。

依賴添加:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.38</version>
</dependency>

配置 Prometheus 拉取指標(biāo)后,可在 Grafana 中創(chuàng)建儀表盤監(jiān)控連接池利用率、慢 SQL 分布等。

??四、安全增強(qiáng)配置??

Druid 提供了多層安全防護(hù),需根據(jù)業(yè)務(wù)風(fēng)險(xiǎn)開啟:

1. 防止 SQL 注入(WallFilter)

spring:
  datasource:
    druid:
      filters: wall,stat,slf4j 
      wall:
        enabled: true
        # 攔截 DELETE/UPDATE 無 WHERE 條件的 SQL
        delete-allow: false 
        update-allow: false 
        # 禁止執(zhí)行存儲(chǔ)過程(高風(fēng)險(xiǎn)操作)
        procedure-allow: false 
        # 允許的白名單 SQL(如健康檢查)
        config:
          select-allow: true 

??作用??:攔截危險(xiǎn) SQL(如 DROP TABLE、無 WHERE 的批量刪除),需結(jié)合業(yè)務(wù)白名單調(diào)整。

2. 密碼加密(避免明文存儲(chǔ))

Druid 支持 AESSHA-256 加密數(shù)據(jù)庫密碼,配置步驟:

生成加密密鑰(通過 DruidPasswordCallback 自定義):

public class MyPasswordCallback extends DecryptPasswordCallback {
    public MyPasswordCallback() {
        super("your-encryption-key"); // 替換為實(shí)際密鑰
    }
}

application.yml 中配置加密后的密碼:

spring:
  datasource:
    druid:
      url: jdbc:mysql://...
      username: root 
      password: encryptedPassword 
      filters: stat,wall 
      connection-properties: config.decrypt=true;config.decrypt.key=myKey 

3. 防御 CC 攻擊(連接頻率限制)

通過 stat-filter 限制單個(gè) IP 的 SQL 執(zhí)行頻率:

spring:
  datasource:
    druid:
      stat-filter:
        enabled: true
        # 單個(gè) IP 最大 SQL 執(zhí)行次數(shù)(每分鐘)
        max-sql-execution-count-per-ip-per-minute: 1000 
        # 單個(gè) URI 最大 SQL 執(zhí)行次數(shù)(每分鐘)
        max-sql-execution-count-per-uri-per-minute: 500 

??五、連接泄漏檢測(生產(chǎn)環(huán)境必備)??

應(yīng)用未正確關(guān)閉連接(如 Connection 未在 finally 塊中釋放)會(huì)導(dǎo)致連接池耗盡,Druid 提供泄漏檢測功能:

spring:
  datasource:
    druid:
      remove-abandoned: true 
      remove-abandoned-timeout: 300 # 連接未關(guān)閉超時(shí)時(shí)間(秒,默認(rèn) 300)
      log-abandoned: true # 記錄泄漏連接的堆棧信息
  • ??原理??:當(dāng)連接被借用超過 remove-abandoned-timeout 秒未歸還時(shí),Druid 會(huì)強(qiáng)制回收并記錄日志(包含調(diào)用棧),便于定位泄漏代碼。
  • ??注意??:僅適用于長事務(wù)或未顯式關(guān)閉連接的場景,正常短連接無需開啟(可能誤判)。

??六、高級優(yōu)化技巧??

1. 動(dòng)態(tài)調(diào)整連接池參數(shù)(運(yùn)行時(shí)調(diào)優(yōu))

通過 Druid 的 DruidDataSource 實(shí)例暴露的 JMX 接口或編程方式動(dòng)態(tài)調(diào)整參數(shù)(如大促期間臨時(shí)擴(kuò)容連接數(shù)):

@Autowired
private DataSource dataSource;

public void adjustPoolSize() {
    if (dataSource instanceof DruidDataSource) {
        DruidDataSource druidDataSource = (DruidDataSource) dataSource;
        // 動(dòng)態(tài)調(diào)整最大連接數(shù)
        druidDataSource.setMaxActive(200); 
        // 動(dòng)態(tài)調(diào)整最小空閑連接數(shù)
        druidDataSource.setMinIdle(50);
    }
}

??注意??:調(diào)整后需觀察數(shù)據(jù)庫負(fù)載,避免瞬間壓力過大。

2. 連接預(yù)熱(冷啟動(dòng)優(yōu)化)

應(yīng)用啟動(dòng)時(shí)預(yù)創(chuàng)建部分連接,避免首次請求時(shí)因連接創(chuàng)建延遲導(dǎo)致超時(shí):

spring:
  datasource:
    druid:
      initial-size: 10 # 初始連接數(shù)(覆蓋默認(rèn) 0)
      test-on-borrow: false # 預(yù)創(chuàng)建時(shí)不校驗(yàn)(提升啟動(dòng)速度)

3. 事務(wù)連接隔離級別優(yōu)化

根據(jù)業(yè)務(wù)需求設(shè)置事務(wù)隔離級別(默認(rèn) READ_COMMITTED):

spring:
  datasource:
    druid:
      default-transaction-isolation: 2 # TRANSACTION_READ_COMMITTED(2)

??七、避坑指南??

??避免過度配置??:maxActive 不要盲目設(shè)置為數(shù)據(jù)庫 max_connections 的上限(如 MySQL 默認(rèn) 151),建議留 20% 余量給管理工具或其他應(yīng)用。

??監(jiān)控優(yōu)先于調(diào)優(yōu)??:所有參數(shù)調(diào)整需基于監(jiān)控?cái)?shù)據(jù)(如連接池利用率、等待隊(duì)列長度),避免主觀臆斷。

??生產(chǎn)環(huán)境禁用調(diào)試功能??:如 log-abandoned=true 可能產(chǎn)生大量日志,需在測試環(huán)境驗(yàn)證后關(guān)閉。

??版本兼容性??:確保 Druid 版本與 Spring Boot、數(shù)據(jù)庫驅(qū)動(dòng)兼容(如 MySQL 8.0 需使用 com.mysql.cj.jdbc.Driver)。

??總結(jié)??

Druid 的極致優(yōu)化需結(jié)合??業(yè)務(wù)場景??(高并發(fā)/低延遲)、??數(shù)據(jù)庫特性??(連接限制/QPS 上限)和??監(jiān)控?cái)?shù)據(jù)??動(dòng)態(tài)調(diào)整。核心步驟為:

1.基礎(chǔ)參數(shù)調(diào)優(yōu)(容量、生命周期)→ 2. 監(jiān)控體系搭建(SQL 統(tǒng)計(jì)、連接狀態(tài))→ 3. 安全增強(qiáng)(防注入、防泄漏)→ 4. 持續(xù)迭代(基于監(jiān)控?cái)?shù)據(jù)優(yōu)化)。

最終目標(biāo)是在??連接利用率??(避免空閑/耗盡)、??性能穩(wěn)定性??(減少連接創(chuàng)建開銷)和??安全性??(防攻擊/泄漏)之間找到平衡。

到此這篇關(guān)于SpringBoot使用Druid連接池進(jìn)行優(yōu)化完整指南的文章就介紹到這了,更多相關(guān)SpringBoot Druid連接池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用JavaCV進(jìn)行圖像灰度化處理

    如何使用JavaCV進(jìn)行圖像灰度化處理

    在計(jì)算機(jī)視覺和圖像處理領(lǐng)域,圖像灰度化是一項(xiàng)基礎(chǔ)且重要的任務(wù),它將彩色圖像轉(zhuǎn)換為灰度圖像,JavaCV 是一個(gè)強(qiáng)大的開源庫,它提供了對各種計(jì)算機(jī)視覺算法和圖像處理操作的支持,本文將詳細(xì)介紹如何使用 JavaCV 進(jìn)行圖像灰度化處理,需要的朋友可以參考下
    2024-10-10
  • 利用Java自寫一個(gè)生成ID的工具類

    利用Java自寫一個(gè)生成ID的工具類

    平時(shí)項(xiàng)目中只要涉及表,那么一定能接觸到眾多各式各樣的ID編號(hào)。本文將通過Java語言實(shí)現(xiàn)手寫一個(gè)ID生成工具類,需要的小伙伴可以參考一下
    2022-11-11
  • SpringBoot與SpringCloud的版本對應(yīng)關(guān)系解讀

    SpringBoot與SpringCloud的版本對應(yīng)關(guān)系解讀

    本文介紹了SpringBoot與SpringCloud的版本對應(yīng)關(guān)系,提供了一個(gè)官方的版本對應(yīng)表,并給出了個(gè)人的一些經(jīng)驗(yàn)總結(jié)
    2024-12-12
  • Java實(shí)現(xiàn)紀(jì)元秒和本地日期時(shí)間互換的方法【經(jīng)典實(shí)例】

    Java實(shí)現(xiàn)紀(jì)元秒和本地日期時(shí)間互換的方法【經(jīng)典實(shí)例】

    這篇文章主要介紹了Java實(shí)現(xiàn)紀(jì)元秒和本地日期時(shí)間互換的方法,結(jié)合具體實(shí)例形式分析了Java日期時(shí)間相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • Java?SpringTask定時(shí)自動(dòng)化處理方法

    Java?SpringTask定時(shí)自動(dòng)化處理方法

    這篇文章主要介紹了Java?SpringTask定時(shí)自動(dòng)化處理,通過自動(dòng)化,不僅可以提高工作效率和準(zhǔn)確性,還可以釋放人力資源以專注于更高價(jià)值的工作,需要的朋友可以參考下
    2024-08-08
  • spring學(xué)習(xí)之參數(shù)傳遞與檢驗(yàn)詳解

    spring學(xué)習(xí)之參數(shù)傳遞與檢驗(yàn)詳解

    這篇文章主要給大家介紹了關(guān)于spring參數(shù)傳遞與檢驗(yàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作能帶來一定的幫助,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • springboot的LogbackLoggingSystem配置加載流程解析

    springboot的LogbackLoggingSystem配置加載流程解析

    這篇文章主要介紹了springboot的LogbackLoggingSystem配置加載流程源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 基于Java方式實(shí)現(xiàn)數(shù)據(jù)同步

    基于Java方式實(shí)現(xiàn)數(shù)據(jù)同步

    這篇文章主要為大家詳細(xì)介紹了基于Java方式實(shí)現(xiàn)數(shù)據(jù)同步,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 查找jdk安裝路徑并且切換多版本jdk的詳細(xì)步驟

    查找jdk安裝路徑并且切換多版本jdk的詳細(xì)步驟

    在日常的工作學(xué)習(xí)中可能需要用到不同版本的jdk,下面這篇文章主要給大家介紹了關(guān)于查找jdk安裝路徑并且切換多版本jdk的詳細(xì)步驟,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java序列化(Serialization) 機(jī)制

    Java序列化(Serialization) 機(jī)制

    本篇文章是對Java中對象的序列化(Serialization) 機(jī)制進(jìn)行了詳細(xì)的分析介紹,并附實(shí)例,需要的朋友可以參考下
    2016-07-07

最新評論