主頁 > 資料庫 > 穩,從資料庫連接池 testOnBorrow 看架構設計

穩,從資料庫連接池 testOnBorrow 看架構設計

2023-06-22 08:08:05 資料庫

本文從 Commons DBCP testOnBorrow 的作用機制著手,管中窺豹,從一點去分析資料庫連接池獲取的程序以及架構分層設計,

以下內容會按照每層的作用,貫穿分析整個呼叫流程,

1??框架層 commons-pool

The indication of whether objects will be validated before being borrowed from the pool.

If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another.

testOnBorrow 不是 dbcp 定義的,是commons-pool 定義的,commons-pool 詳細的定義了資源池使用的一套規范和運行流程,

/**
 * Borrow an object from the pool. get object from 資源池
 * @see org.apache.commons.pool2.impl.GenericObjectPool#borrowObject(long)
 */
public T borrowObject(final long borrowMaxWaitMillis) throws Exception {
	
	PooledObject<T> p = null;
	
    // if validation fails, the instance is destroyed and the next available instance is examined. 
    // This continues until either a valid instance is returned or there are no more idle instances available.
	while (p == null) {
        // If there is one or more idle instance available in the pool, 
        // then an idle instance will be selected based on the value of getLifo(), activated and returned.
		p = idleObjects.pollFirst();
		if (p != null) {
            // 設定 testOnBorrow 就會進行可用性校驗
			if (p != null && (getTestOnBorrow() || create && getTestOnCreate())) {
				boolean validate = false;
				Throwable validationThrowable = null;
				try {
                    // 具體的校驗實作由實作類完成,
                    // see org.apache.commons.dbcp2.PoolableConnectionFactory
					validate = factory.validateObject(p);
				} catch (final Throwable t) {
					PoolUtils.checkRethrow(t);
					validationThrowable = t;
				}
				if (!validate) {
					try {
                        // 如果校驗例外,會銷毀該資源,
                        // obj is not valid and should be dropped from the pool
						destroy(p);
						destroyedByBorrowValidationCount.incrementAndGet();
					} catch (final Exception e) {
						// Ignore - validation failure is more important
					}
					p = null;
				}
			}
		}
	}

	return p.getObject();
}

2??應用層 commons-dbcp

dbcp 是特定于管理資料庫連接的資源池,

PoolableConnectionFactory is a PooledObjectFactory

PoolableConnection is a PooledObject

/**
 * @see PoolableConnectionFactory#validateObject(PooledObject)
 */
@Override
public boolean validateObject(final PooledObject<PoolableConnection> p) {
	try {
		/**
		 * 檢測資源池物件的創建時間,是否超過生存時間
		 * 如果超過 maxConnLifetimeMillis, 不再委托資料庫連接進行校驗,直接廢棄改資源
		 * @see PoolableConnectionFactory#setMaxConnLifetimeMillis(long)
		 */
		validateLifetime(p);
		// 委托資料庫連接進行自我校驗
		validateConnection(p.getObject());
		return true;
	} catch (final Exception e) {
		return false;
	}
}

/**
 * 資料庫連接層的校驗,具體到是否已關閉、是否與 server 連接可用
 * @see Connection#isValid(int)
 */
public void validateConnection(final PoolableConnection conn) throws SQLException {
	if(conn.isClosed()) {
		throw new SQLException("validateConnection: connection closed");
	}
	conn.validate(_validationQuery, _validationQueryTimeout);
}

3??基礎層 mysql-connector-java

Returns true if the connection has not been closed and is still valid.

這個是 java.sql.Connection 定義的規范,具體實作根據對應資料庫的driver 來完成,使用某種機制用來探測連接是否可用,

/**
 * 呼叫 com.mysql.jdbc.MysqlIO, 發送ping 請求,檢測是否可用
 * 對比 H2 資料庫,是通過獲取當前事務級別來檢測連接是否可以,但是忽略了 timeout 配置,畢竟是 demo 資料庫 ??
 */
public synchronized boolean isValid(int timeout) throws SQLException {
	if (this.isClosed()) {
		return false;
	} else {
		try {
			this.pingInternal(false, timeout * 1000);
			return true;
		} catch (Throwable var5) {
			return false;
		}
	}
}

參考:MySQL 的連接時長控制--interactive_timeout和wait_timeout_翔云123456的博客-CSDN博客

總結

  • commons-pool 定義資源的完整宣告周期介面,包括:makeObject、activateObject、validateObject、passivateObject、destoryObject,資源池管理物件,通過實作這些介面即可實作資源控制,參考:org.apache.commons.pool2.PooledObjectFactory
  • 在校驗程序中,牽涉到很多時間,包括資源池物件的創建時間、生存時間、資料庫連接的超時時間、Mysql 連接空閑超時時間等,不同層為了服務可靠性,提供不同的時間配置,校驗也是層層遞進,最終委托到最底層來判斷,
  • 校驗程序中,對于連接也會由是否已關閉的校驗(isClosed() ),包括PoolableConnection#isClosed, Connection#isClosed, Socket#isClosed, 同樣也是層層保障,確保整個架構的可靠,??
  • 定義一套完整嚴謹的規范和標準,比實作一個具體的功能或者特性要求更高 ??,commons-pool 和 jdbc 定義了規范,commons-dbcp 和 mysql-connector-java 完成了具體的實作,有了規范和介面,組件和框架的對接和兼容才變為可能,

more 理解高可用

在閱讀 MySQL Driver 原始碼程序中,有個點要特別記錄下,以 MySQL Driver 創建連接為例,用重試連接實作可用性,這就是高可用,??

高可用不是一個口號,也不是復雜的概念和公式,能夠實實在在體系化的解決一類問題就是架構的目的,結合上述的架構分層,如果解決問題的方案通用性好,并且實作很優雅,就是好的架構,

// autoReconnect 
public void createNewIO(boolean isForReconnect) throws SQLException {
    synchronized (getConnectionMutex()) {
        // jdbc.url autoReconnect 指定為 true,識別為 HighAvailability,emmm..... ??
        if (!getHighAvailability()) {
            connectOneTryOnly(isForReconnect, mergedProps);
            return;
        }
        // maxReconnects 默認為 3,重試失敗的提示就是: Attempted reconnect 3 times. Giving up.
        connectWithRetries(isForReconnect, mergedProps);
    }
}

作者:京東物流 楊攀

來源:京東云開發者社區

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/555800.html

標籤:MySQL

上一篇:InnoDB鎖初探(一):鎖分類和RR不同場景下的鎖機制

下一篇:返回列表

標籤雲
其他(161478) Python(38244) JavaScript(25512) Java(18251) C(15238) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7264) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1971) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 穩,從資料庫連接池 testOnBorrow 看架構設計

    本文從 Commons DBCP testOnBorrow 的作用機制著手,管中窺豹,從一點去分析資料庫連接池獲取的程序以及架構分層設計。以下內容會按照每層的作用,貫穿分析整個呼叫流程。 ......

    uj5u.com 2023-06-22 08:08:05 more
  • InnoDB鎖初探(一):鎖分類和RR不同場景下的鎖機制

    # Mysql資料庫鎖(Innodb) 資料庫鎖是Mysql實作資料一致性的基礎之一,是在事務的基礎之上,基于Mysql Server層或存盤引擎層實作的。 ## 鎖日志 前置條件: ```sql set GLOBAL innodb_status_output=ON; set GLOBAL inno ......

    uj5u.com 2023-06-22 08:07:58 more
  • ClickHouse技術研究及語法簡介

    本文對Clickhouse架構原理、語法、性能特點做一定研究,同時將其與mysql、elasticsearch、tidb做橫向對比,并重點分析與mysql的語法差異,為有mysql遷移clickhouse場景需求的技術預研及參考。 ......

    uj5u.com 2023-06-22 08:07:50 more
  • MySQL一個關于derived table的bug描述與規避

    # 關聯文章: - [MySQL對derived table的優化處理與使用限制](http://mp.weixin.qq.com/s?__biz=MzkzMTIzMDgwMg==&mid=2247501528&idx=1&sn=03ea1cd0eb8f42bacda0583879ad494c&ch ......

    uj5u.com 2023-06-22 08:07:42 more
  • HiveSQL在使用聚合類函式的時候性能分析和優化詳解

    帶聚合函式的SQL邏輯,我們可以根據其執行程序的不同,將其分成三大類來進行分析:
    僅在Reduce階段聚合的SQL執行邏輯
    在Map和Reduce階段都有聚合操作的SQL執行邏輯
    高級分組聚合的執行SQL邏輯 ......

    uj5u.com 2023-06-22 08:07:24 more
  • 性能提升30%!袋鼠云數堆疊基于 Apache Hudi 的性能優化實戰決議

    Apache Hudi 是一款開源的[資料湖解決方案](https://www.dtstack.com/dtengine/easylake?src=https://www.cnblogs.com/DTinsight/p/szsm),它能夠幫助企業更好地管理和分析海量資料,支持高效的[資料更新和查詢](https://www.dtstack.com/dtengine/ea ......

    uj5u.com 2023-06-22 08:07:14 more
  • ClickHouse(14)ClickHouse合并樹MergeTree家族表引擎之Versioned

    [toc] >VersionedCollapsingMergeTree引擎繼承自MergeTree并將折疊行的邏輯添加到合并資料部分的演算法中。VersionedCollapsingMergeTree用于相同的目的折疊樹但使用不同的折疊演算法,允許以多個執行緒的任何順序插入資料。特別是,Version列有 ......

    uj5u.com 2023-06-22 08:07:07 more
  • InnoDB 記憶體結構之更改緩沖區

    更改緩沖區(Change Buffer)是一種特殊的資料結構,用于快取不在緩沖池中的二級索引(secondary index)頁的更改。可能來自于 INSERT、UPDATE 或 DELETE 操作(資料操作語言,DML)的緩沖更改,會在后續通過其他讀操作將這些頁加載到緩沖池時被合并。 ......

    uj5u.com 2023-06-21 08:53:09 more
  • 華為云GaussDB為MetaERP“成本核算”產品“保駕護航”

    摘要:華為宣布實作了自主創新的MetaERP研發,并且完成了對舊ERP系統的全面替換,這其中,就采用了華為云GaussDB資料庫特有的全密態技術,對ERP系統中的絕密資料進行加密保護,從而保障了資料的安全。 ERP系統在幫助企業優化業務流程、實作數字化管理方面有重要作用,可以說企業所有的業務流轉都需 ......

    uj5u.com 2023-06-21 08:53:02 more
  • CSR格式如何更新? GES圖計算引擎HyG揭秘之資料更新

    摘要:HyG圖計算引擎采用CSR格式來存盤圖的拓撲資訊,CSR格式可以將稀疏矩陣的存盤空間壓縮,進而大大降低圖的存盤開銷,同時具備訪問效率高、格式易轉化等優點。 本文分享自華為云社區《CSR格式如何更新? GES圖計算引擎HyG揭秘之資料更新》,作者: π 。 HyG圖計算引擎采用CSR格式來存盤圖 ......

    uj5u.com 2023-06-21 08:52:51 more