彈性資料庫連接池探活策略調研(二)——Druid

来源:https://www.cnblogs.com/jingdongkeji/archive/2023/09/07/17684225.html
-Advertisement-
Play Games

在上一篇文章中,我們介紹了彈性資料庫連接失效的背景,並探討了HikariCP連接池探活策略的相關內容。在本文中,我們將會繼續探討另一個線上常用的連接池——Druid,併為您介紹如何在使用Druid時實現最佳實踐的彈性資料庫連接池探活策略。 ...


前言

上一篇文章中,我們介紹了彈性資料庫連接失效的背景,並探討了HikariCP連接池探活策略的相關內容。在本文中,我們將會繼續探討另一個線上常用的連接池——Druid,併為您介紹如何在使用Druid時實現最佳實踐的彈性資料庫連接池探活策略。

Druid

Druid的版本迭代更新比較快,同時探活配置的參數也比較多,這導致即使是相同的參數在不同的版本中達到的效果也可能不一樣。但與探活相關的邏輯實現只存在源碼里的兩個函數里, 我們先列舉一下跟Druid探活相關的參數,在具體看一下源碼的實現對這些參數的使用。日後我們在開發中遇到配置探活不生效的情況下,可以看一下對應版本源碼來判斷自己的探活是否配置正確。

下麵是與Druid探活相關的參數:

參數名稱 說明 預設值
initialSize 初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時。 0
minIdle 最小連接池數量。 0
maxActive 最大連接池數量。 8
testOnBorrow 申請連接時執行validationQuery配置的SQL檢測連接是否有效,做了這個配置會降低性能。 false
testOnReturn 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。 false
testWhileIdle 建議配置為true,不影響性能,並且保證安全性。在連接池中申請連接的時候檢測,如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。 大多數版本為True
timeBetweenEvictionRunsMillis 1) Destroy線程會檢測連接的間隔時間,每隔這個值的時間就會執行一次DestroyTask。 2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明。 大多數版本是1分鐘
keepAlive 連接池中的minIdle數量以內的連接,空閑時間超過minEvictableIdleTimeMillis,則會執行探活操作此參數在1.0.28以上的版本才支持 詳細說明參考官方文檔。 false
keepAliveBetweenTimeMillis 配合keepAlive使用在低版本不支持,如果空閑時間小於timeBetweenEvictionRunsMillis但大於keepAliveBetweenTimeMillis扔執行探活操作 大多數版本是2分鐘
validationQuery 用來檢測連接是否有效的sql,要求是一個查詢語句。 select 1
validationQueryTimeout 單位:秒,檢測連接是否有效的超時時間。底層調用jdbc Statement對象的void setQueryTimeout(int seconds)方法
minEvictableIdleTimeMillis 連接空閑時間大於該值時關閉空閑連接大於minIdle的連接,類似hikaricp的idleTimeout 30分鐘
maxEvictableIdleTimeMillis 連接空閑時間大於該值時不管minIdle都關閉該連接,類似hikaricp的maxlifetime(低版本不支持) 7小時

Druid的探活主要有以下兩個函數來實現:

  • com.alibaba.druid.pool.DruidDataSource#getConnectionDirect

getConnectionDirect是每次從連接池中取連接時會被調用的函數。我們從下麵的代碼中可以看出,如果testOnBorrow為true,則每次獲取連接之前都會檢測連接是否有效。如果testOnBorrow為false且testWhileIdle為true,則需要判斷連接的空閑時間是否超過timeBetweenEvictionRunsMillis設置的值,如果超過則進行探活檢測。失效的連接會被丟棄,並且會補充到連接池的minIdle數量。timeBetweenEvictionRunsMillis在大多數版本中的預設值為1分鐘。只要這個值設置的時間小於十分鐘,並且保證testWhileIdle開啟,就能保證拿不到網關關閉的失效連接。

在不支持keepalive的低版本中,只能依靠testOnBorrow或testWhileIdle來進行探活。建議配置testWhileIdle來進行探活。在高併發的場景下,這種方式的性能消耗會更小一些。

  • com.alibaba.druid.pool.DruidDataSource#shrink(boolean, boolean)

在下麵的代碼中我們可以看出,shrink方法是在DestroyTask線程的run方法中調用的,用於銷毀連接池中的連接。如果timeBetweenEvictionRunsMillis大於0,則每隔這個時間間隔就會調用destroyTask.run(boolean, boolean)方法,即執行shrink方法。

從上面的代碼中可以看出,shrink方法會使用keepAlive參數。需要註意的是,在不同版本的Druid中,keepAlive參數的支持和實現邏輯可能不同。官方建議在使用keepAlive參數時,應該使用1.1.21以上的版本。儘管官方文檔中說明瞭空閑時間超過minEvictableIdleTimeMillis,就會執行探活操作,但是在高版本中,這個探活操作的執行時間也受到了keepAliveBetweenTimeMillis參數的影響。因此,在高版本中,如果想要正確地使用keepAlive參數,就需要瞭解其在具體版本中的實現邏輯。

下麵代碼是1.1.10和1.1.21版本中關於shrink方法的源碼對比:

首先看一下1.1.10版本的源碼,它首先會判斷連接空閑時間是否大於minEvictableIdleTimeMillis,如果是,則接下來進行第二步的判斷:是否是多於minIdle的空閑連接。如果是,就將這些連接加入到驅逐連接的數組中,以便進行後續的驅逐操作。如果不是,就再次判斷連接空閑時間是否大於maxEvictableIdleTimeMillis,如果是,則將這些連接加入到驅逐連接的數組中。如果也不是,則進行最後的判斷:是否開啟了keepAlive配置。如果開啟了,就將這些連接加入到保活連接數組中,以進行後續的探活操作。

在1.1.21版本中,shrink方法的總體邏輯與1.1.10版本類似,但是新增了一個名為keepAliveBetweenTimeMillis的參數。這個參數決定了使用keepAlive進行探活的時間間隔,其預設值為2分鐘,keepalive開啟且空閑時間大於這個值會進行探活。

另一個不同點是,在進行探活操作時,1.1.10版本僅會關閉無效的連接,但1.1.21版本則更進一步,除了關閉無效連接外,還會自動添加連接以達到minIdle的最小連接數。

1.1.10 1.1.21

總結,druid的探活參數在1.0.28版本之前沒有定時的探活功能只能在每次拿到連接前進行檢測是否有效,建議配置testWhileIdle為true在高併發情況下不會太影響性能,如果對可用性要求高的可以開啟testOnBorrow,以在每次獲取連接時檢測連接的有效性。在高版本中可以用keepAlive參數對連接進行保活。針對線上使用Druid連接池的應用建議使用支持keepAlive的1.1.21或者更高版本。

JED配置模版:

Druid1.1.10

<propertyname="testWhileIdle"value="true"/>    
<propertyname="validationQuery"value="SELECT 1"/>    
<propertyname="timeBetweenEvictionRunsMillis"value="30000"/>    
<propertyname="minEvictableIdleTimeMillis"value="300000"/>
<propertyname="keepAlive"value=true/>

此版本支持keepAlive可以配置minEvictableIdleTimeMillis時間小於10分鐘,能夠高效的進行探活防止網關關閉連接。

Druid1.1.9

同1.1.10

Druid1.0.9

<propertyname="testWhileIdle"value="true"/>    
<propertyname="validationQuery"value="SELECT 1"/>    
<propertyname="timeBetweenEvictionRunsMillis"value="30000"/>    
<propertyname="minEvictableIdleTimeMillis"value="300000"/>

此版本不支持keepAlive只能在獲取連接對象的時候檢測,對可用性高的也可以開啟testOnBorrow。

作者:京東零售 王雷鑫

來源:京東雲開發者社區 轉載請註明來源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博主之前發佈了紅帽體系的Centos7關於openssl和openssh的升級操作;本文就Ubuntu系統再次分享和交流ssh的升級。如有不正確,歡迎在評論區指出。 之前博主的相關文章: openssh-淺談openssl和openssh的升級 - 李宗盛 - 博客園 (cnblogs.com) o ...
  • 對於有科班背景的讀者,可以跳過本系列文章。這些文章的主要目的是通過簡單易懂的彙總,幫助非科班出身的讀者理解底層知識,進一步瞭解為什麼在面試中會涉及這些底層問題。否則,某些概念將始終無法理解。這些電腦基礎文章將為你打通知識的任督二脈,祝你在編程領域中取得成功! ...
  • 1. 進程和線程的區別 進程(Process)和線程(Thread)是操作系統中的重要概念,它們表示執行中的程式的不同執行單元。下麵是它們的區別: 定義:進程是一個獨立的執行環境,具有獨立的記憶體空間,包含程式代碼、數據和執行狀態。線程是進程內的一個執行單元,共用相同的記憶體空間和系統資源。 資源占用: ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202309/3076680-20230907165115014-2093238023.png) # 1. 從軟體本身和它運行的典型工作負載來看,MySQL通常也更適合運行在廉價硬體上 # 2. 基本資源 ## ...
  • 編輯my.ini或者my.cnf文件 #### 清空binlog信息 ```sql #查看現存的binlog文件列表 show master logs; #重置清空binlog文件 reset master; #重置清空後 重新查看現存的binlog文件列表 是否都被清空了 show master ...
  • 本文分享自華為雲社區《GaussDB AP是如何執行SQL的》,作者:yd_270088468。 前言 介紹GaussDB AP各組件是如何協調工作的,會著重介紹SQL引擎。 1、SQL引擎組件和SQL生命周期 Parser: 詞法/語法分析模塊。詞法分析會從SQL字元串中解析出一個個單詞,作為語法 ...
  • GaussDB的遷移場景越來越多,也越來越複雜,所以我們會不斷地進行探索和創新,讓我們的方案更完善,遷移過程更平滑。 ...
  • SqlServer 單用戶解決方案 USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID) - FROM master..sysprocesses WHERE dbid= ...
一周排行
    -Advertisement-
    Play Games
  • 前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...