數據庫連接池性能優化實戰

?背景

我們公司正在處于某個項目的維護階段,領導對資源告警比較重視,服務器資源告警的就不說了,運維同學每隔一小時都會檢測線上環境的應用服務信息,例如:網關日志響應時間告警/nginx日志接口響應時間告警/日志關鍵字異常日志告警等,每周都需要對告警信息的排查分析~

都是通過郵件發送給干系人~

?例如,這個是郵件信息截圖~

?排查思路

日志--【檢索】->traceId--【skywaling】->完整的調用鏈信息

1.從日志中查到TraceId。

2.通過TraceId獲取調用鏈

通過traceId在skywalking中的可視化界面上可以看出獲取數據庫鏈接就花費了7百多毫秒

大家無需糾結接口花費了6s多,而本次卻在重點說獲取鏈接池的情況。其他的可以從代碼或者sql進行入手優化~~只是獲取數據庫鏈接耗時較多,所以著重進行了分析。

3.查看該應用的數據庫鏈接池配置

    druid:# 初始化時建立物理連接的個數initial-size: 20# 最大連接池數量max-active: 100# 最小連接池數量min-idle: 20# 獲取連接時最大等待時間max-wait: 60000# 是否緩存preparedStatement,也就是PSCache。pool-prepared-statements: false# 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。max-pool-prepared-statement-per-connection-size: -1# 用來檢測連接是否有效的sql,要求是一個查詢語句,常用select 'x'。validation-query: SELECT 'x'# 單位:秒,檢測連接是否有效的超時時間。validation-query-timeout: 1# 申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。test-on-borrow: false# 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。test-on-return: false# 建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。test-while-idle: true# 有兩個含義:1) Destroy線程會檢測連接的間隔時間,如果連接空閑時間大于等于minEvictableIdleTimeMillis則關閉物理連接。2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明time-between-eviction-runs-millis: 6000# 連接保持空閑而不被驅逐的最小時間min-evictable-idle-time-millis: 1200000max-evictable-idle-time-millis: 1800000# 監控頁面相關配置stat-view-servlet:url-pattern: /druid/*allow: ""enabled: true

4.獲取該應用數據庫鏈接池的監控(需要對應的時間段)

從圖中可以看出PoolingCount在這個時刻突然下降,突然下降可能表示有突發流量

詳細解釋(poolingCount?)

在數據庫連接池監控中,poolingCount?是一個重要的監控指標,它表示當前連接池中空閑的、可用的數據庫連接數量

含義

  • poolingCount?表示連接池中當前處于空閑狀態、可以被應用程序直接獲取使用的連接數量

  • 這些連接已經創建并與數據庫建立了連接,但暫時沒有被應用程序使用

  • 它是連接池中"準備好的"連接的數量

相關指標對比

在常見的連接池實現中,通常會有以下相關指標:

指標名稱含義
poolingCount當前空閑連接數
activeCount當前活躍連接數(正在被使用的連接)
maxActive連接池最大允許的連接數
minIdle連接池保持的最小空閑連接數
maxIdle連接池允許的最大空閑連接數

監控意義

  1. 性能調優依據

    • 如果?poolingCount?經常為0,可能表明連接池配置過小

    • 如果?poolingCount?長期很高,可能表明配置過大

  2. 問題診斷

    • poolingCount?突然下降可能表示有突發流量

    • poolingCount?長期低位可能表示連接泄漏

  3. 容量規劃

    • 結合?activeCount?和?poolingCount?可以評估連接池使用情況

    • 幫助確定合適的?maxActive?和?minIdle?參數

? 圖表匯總分析(監控時間:近6小時)

1. IdleConnection(空閑連接)

  • 大部分時間維持在 20 左右,直到接近 14:00 時突然拉升。

  • 說明min-idle: 20 已經生效,Druid 正在努力維持至少 20 個空閑連接。


2. PoolingCount(連接池中的連接總數)

  • 長期穩定在 5~10 左右,你說的問題驗證了。

  • 但注意這個指標來源標注為 TotalConnection(...),它并非嚴格意義的“空閑連接數”,可能是連接池當前存在的連接總數(和 Idle + Active 的關系要確認 exporter 定義)。


3. ActiveConnection(活躍連接數)

  • 絕大多數時間活躍連接在 0~2 之間

  • 即使接近 14:00 的高峰期,也只有少量連接(<10)在活躍使用;

  • ? 說明系統當前數據庫并發負載是低的


4. ThreadsAwaitingConnection(等待獲取連接的線程數)

  • 全程為 0;

  • ? 說明連接池沒有連接耗盡問題,應用線程從不需等待連接。


5. MaxConnection(連接池歷史最大并發連接數)

  • 常態是 4,只有在快到 14:00 時突增至 200;

  • 猜測是某個服務(或某次壓測)在那個時段拉高了連接數。


? 結論

項目結論
min-idle 是否生效?? 是的,空閑連接維持在 20
是否存在連接不足 / 堵塞?? 沒有。activeCountwaitThreadCount 都非常低
是否需要增加 min-idle?? 目前不需要,現有配置已滿足需求
是否要擴大連接池?? 不需要,max-active: 100 遠超實際并發需求

當前鏈接數在22左右,超過了預熱的的鏈接數20,所以需要與mysql中建立鏈接。

思考:

但是為什么與mysql建立鏈接這么長時間?

1.mysql的監控

Threads Cached = 1 意味著什么?

這表示:

  • 當前 MySQL 有 1 個空閑線程 在等待下一個連接復用;

  • 如果有新連接請求到來,MySQL 可以立刻用這 1 個線程處理,而 無需調用 pthread_create() 創建新線程

重點觀察圖表分析

1.?線程緩存 (MySQL Thread Cache)

  • Threads Created?幾乎為 0,說明線程緩存有效;

  • 但?Threads Cached?明顯有下降段(21:45 前后出現斷崖);

  • ?表示短時間內大量連接請求導致緩存線程被用完,需新建線程。

這會造成連接響應變慢,尤其是連接池新建連接時要與數據庫創建新線程,代價高。


2.?臨時表 (MySQL Temporary Objects)

  • 每秒創建臨時表數在 4~5 個,且偶爾觸發?Created Tmp Disk Tables(磁盤臨時表);

  • 說明存在大量使用?GROUP BYORDER BY、子查詢、聯合查詢等臨時表消耗。

?磁盤臨時表嚴重影響 SQL 響應速度,從而增加連接持有時間。


3.?排序 (MySQL Sorts)

  • Sort Rows?高峰時可達 30~40;

  • Sort Scan?也非 0,說明未命中索引的排序操作存在。

?排序越多、越復雜,單個 SQL 執行越慢 → 應用端連接持有時間越長 → 導致連接池空閑不足。


4.?Select Types 分布

  • Select Scan?穩定在高位,說明存在大量全表掃描;

  • Select Range?較低,表示索引未能充分利用。


5.?慢查詢 (MySQL Slow Queries)

  • 21:45 左右出現明顯慢 SQL 峰值,最高達 1.45/s;

  • 時間點與線程緩存耗盡、臨時表升高高度吻合!


綜合分析:導致連接獲取慢的根因

MySQL 層臨時表多 / 排序多 / 索引未命中SQL 響應時間延長,連接被長時間占用
MySQL 層Thread Cache 命中率下降新建線程成本高,拖慢新連接初始化
應用層連接池配置不足 / minIdle 過低無法預熱足夠連接,應對突發請求
應用層SQL 過慢 + 連接未及時釋放導致連接池回收和復用效率變差

?優化建議

A. MySQL 層建議

慢查詢排查開啟?slow_query_log,排查 21:45 的慢 SQL
索引優化優化?SELECT SCAN?多的表結構,添加合適聯合索引
避免臨時表檢查是否有復雜嵌套子查詢 / group by 未配 index
調大線程緩存thread_cache_size = 128
臨時表優化調整?tmp_table_size?和?max_heap_table_size?至 128M 起步
排序優化優化?ORDER BY?相關 SQL,能使用索引就用索引

B. 應用層建議(Druid)

spring:datasource:druid:initial-size: 30min-idle: 30max-active: 100max-wait: 30000validation-query: SELECT 1test-on-borrow: truetest-while-idle: truetime-between-eviction-runs-millis: 5000remove-abandoned: trueremove-abandoned-timeout: 180log-abandoned: true

重點說明:

  • initial-size,?min-idle: 提高初始連接和空閑連接數,快速預熱;

  • test-on-borrow: 確保連接可用,避免使用“死連接”;

  • remove-abandoned: 回收長時間未關閉連接,防止泄露;

  • max-wait: 縮短應用等待連接時間,提高失敗可控性;

總結一句話:

MySQL 當前存在執行慢 / 緩存線程耗盡 / 排序臨時表密集的問題,間接導致應用端連接獲取慢,連接池設置不當進一步放大了問題

當前mysql數據庫設置:

SHOW VARIABLES LIKE 'thread_cache_size';

68?

將thread_cache_size 調整到128后,后續再看結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91398.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91398.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91398.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Excel常用函數大全,非常實用

一、數學與統計函數1. SUM作用&#xff1a;求和SUM(number1, [number2], ...)SUM(A1:A10) ? 計算A1到A10單元格的總和注意&#xff1a;自動忽略文本和空單元格2. AVERAGE作用&#xff1a;計算平均值AVERAGE(number1, [number2], ...)AVERAGE(B2:B20) ? 計算B列20個數據的平均…

性能優化(一):時間分片(Time Slicing):讓你的應用在高負載下“永不卡頓”的秘密

性能優化(一)&#xff1a;時間分片&#xff08;Time Slicing&#xff09;&#xff1a;讓你的應用在高負載下“永不卡頓”的秘密 引子&#xff1a;那張讓你瀏覽器崩潰的“無限列表” 想象一個場景&#xff1a;你需要渲染一個包含一萬個項目的列表。在我們的“看不見”的應用中&a…

《C++》STL--list容器詳解

在 C 標準模板庫(STL)中&#xff0c;list 是一個非常重要的序列容器&#xff0c;它實現了雙向鏈表的數據結構。與 vector 和 deque 不同&#xff0c;list 提供了高效的插入和刪除操作&#xff0c;特別是在任意位置。本文將深入探討 list 容器的特性、使用方法以及常見操作。 文…

Day 28:類的定義和方法

DAY 28 類的定義和方法 知識點學習 1. 類的定義 在Python中&#xff0c;類是創建對象的模板。使用class關鍵字來定義一個類。類名通常采用首字母大寫的命名方式&#xff08;PascalCase&#xff09;。 # 最簡單的類定義 class MyClass:pass # 使用pass占位符類的定義就像是…

OSPF綜合實驗報告冊

一、實驗拓撲二、實驗要求1、R4為ISP&#xff0c;其上只配置IP地址&#xff1b;R4與其他所直連設備間均使用公有IP&#xff1b; 2、R3-R5、R6、R7為MGRE環境&#xff0c;R3為中心站點&#xff1b; 3、整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;除了R12有兩個環回&#x…

網絡層6——內部網關協議RIP、OSPF(重點)

目錄 一、基本概念 1、理想的路由算法應具備的特點 2、分層次的路由選擇協議 二、內部網關協議RIP 1、特點 2、路由交換信息 3、距離向量算法 4、壞消息傳送慢問題 5、RIP報文格式 三、內部網關協議OSPF 1、特點 2、其他特點 3、自治系統區域劃分 4、OSPF的5中分…

同品牌的系列廣告要如何保證宣傳的連貫性?

對于品牌的系列廣告而言&#xff0c;內容的連貫性十分重要。如果系列廣告之間缺乏內在聯系&#xff0c;不僅會削弱品牌形象的統一性&#xff0c;還可能導致用戶的認知混亂。保證宣傳內容的連貫性不是讓每則廣告完全相同&#xff0c;而是在變化中保持核心要素的一致性。我們該如…

深度學習:激活函數Activaton Function

一、為什么需要激活函數&#xff1f;神經網絡本質上是多個線性變換&#xff08;矩陣乘法&#xff09;疊加。如果沒有激活函數&#xff0c;即使疊加多層&#xff0c;整體仍等價于一個線性函數&#xff1a;這樣的網絡無法學習和擬合現實世界中復雜的非線性關系。激活函數的作用&a…

deepseek: 切分類和長函數到同名文件中

import re import sys import os import ast from tokenize import generate_tokens, COMMENT, STRING, NL, INDENT, DEDENT import iodef extract_entities(filename):"""提取類和函數到單獨文件"""with open(filename, r, encodingutf-8) as f…

新型融合肽遞送外泌體修飾可注射溫敏水凝膠用于骨再生

溫敏水凝膠因能模擬細胞外基質微環境&#xff0c;且具有原位注射性和形態適應性&#xff0c;在骨組織工程中應用廣泛。小腸黏膜下層&#xff08;SIS&#xff09;作為天然細胞外基質來源&#xff0c;富含 I 型和 III 型膠原蛋白及多種生物活性因子&#xff0c;其制備的水凝膠在組…

SPI接口的4種模式(根據時鐘極性和時鐘相位)

SPI&#xff08;Serial Peripheral Interface&#xff09; 接口根據時鐘極性&#xff08;CPOL&#xff09;和時鐘相位&#xff08;CPHA&#xff09;的不同組合&#xff0c;共有 4種工作模式。這些模式決定了數據采樣和傳輸的時序關系&#xff0c;是SPI通信中必須正確配置的關鍵…

Java:高頻面試知識分享2

HashSet 和 TreeSet 的區別&#xff1f;底層實現&#xff1a;HashSet 基于 HashMap 實現&#xff0c;使用哈希表存儲元素&#xff1b;TreeSet 基于 TreeMap&#xff0c;底層為紅黑樹。元素順序&#xff1a;HashSet 無序&#xff1b;TreeSet 會根據元素的自然順序或傳入的 Compa…

C語言習題講解-第九講- 常見錯誤分類等

C語言習題講解-第九講- 常見錯誤分類等1. C程序常見的錯誤分類不包含&#xff1a;&#xff08; &#xff09;2. 根據下面遞歸函數&#xff1a;調用函數 Fun(2) &#xff0c;返回值是多少&#xff08; &#xff09;3. 關于遞歸的描述錯誤的是&#xff1a;&#xff08; &#x…

A?算法(A-star algorithm)一種在路徑規劃和圖搜索中廣泛使用的啟發式搜索算法

A?A*A?算法&#xff08;A-star algorithm&#xff09;是一種在路徑規劃和圖搜索中廣泛使用的啟發式搜索算法&#xff0c;它結合了Dijkstra算法的廣度優先搜索思想和啟發式算法的效率優勢&#xff0c;能夠高效地找到從起點到終點的最短路徑。 1. 基本原理 A*算法的核心是通過估…

UniappDay06

1.填寫訂單-渲染基本信息 靜態結構&#xff08;分包&#xff09;封裝請求API import { http } from /utils/http import { OrderPreResult } from /types/orderexport const getmemberOrderPreAPI () > {return http<OrderPreResult>({method: GET,url: /member/orde…

論文略讀:GINGER: Grounded Information Nugget-Based Generation of Responses

SIGIR 2025用戶日益依賴對話助手&#xff08;如 ChatGPT&#xff09;來滿足多種信息需求&#xff0c;這些需求包括開放式問題、需要推理的間接回答&#xff0c;以及答案分布在多個段落中的復雜查詢RAG試圖通過在生成過程中引入檢索到的信息來解決這些問題但如何確保回應的透明性…

從內部保護你的網絡

想象一下&#xff0c;你是一家高端俱樂部的老板&#xff0c;商務貴賓們聚集在這里分享信息、放松身心。然后假設你雇傭了最頂尖的安保人員——“保鏢”——站在門口&#xff0c;確保你準確掌握所有進出的人員&#xff0c;并確保所有人的安全。不妨想象一下丹尼爾克雷格和杜安約…

Redis 中 ZipList 的級聯更新問題

ZipList 的結構ZipList 是 Redis 中用于實現 ZSet 的壓縮數據結構&#xff0c;其元素采用連續存儲方式&#xff0c;具有很高的內存緊湊性。ZipList 結構組成如下&#xff1a;zlbytes&#xff1a;4字節&#xff0c;記錄整個ziplist的字節數zltail&#xff1a;4字節&#xff0c;記…

【蒼穹外賣項目】Day05

&#x1f4d8;博客主頁&#xff1a;程序員葵安 &#x1faf6;感謝大家點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb; 一、Redis入門 Redis簡介 Redis是一個基于內存的 key-value 結構數據庫 基于內存存儲&#xff0c;讀寫性能高適合存儲熱點數據&#xff08;熱…

語音識別dolphin 學習筆記

目錄 Dolphin簡介 Dolphin 中共有 4 個模型&#xff0c;其中 2 個現在可用。 使用demo Dolphin簡介 Dolphin 是由 Dataocean AI 和清華大學合作開發的多語言、多任務語音識別模型。它支持東亞、南亞、東南亞和中東的 40 種東方語言&#xff0c;同時支持 22 種漢語方言。該模…