深入理解mysql中的各種超時屬性

1. 前言

connectTimeout: 連接超時
loginTimeout: 登錄超時
socketTimeout: Socket網絡超時,即讀超時
queryTimeout: sql執行超時
transactionTimeout:spring事務超時
innodb_lock_wait_timeout:innodb鎖等待超時
wait_timeout:非交互式連接關閉前的等待時間
interactive_wait_timeout:交互式連接關閉前的等待時間
netTimeoutForStreamingResults:mysql server網絡回包寫超時(針對大量數據查詢的sql)

2 connectTimeout和loginTimeout

mysql數據庫在建立連接時,會在connectTimeout 、loginTimeout這兩個變量中的取其之一作為真正的連接超時屬性,具體取值邏輯是在com.mysql.cj.protocol.StandardSocketFactory#connect建立連接時調用的getRealTimeout方法。

在這里插入圖片描述
在這里插入圖片描述
getRealTimeout方法的expectedTimeout參數值是connnectTimeout.
getRealTimeout的邏輯是如果loginTimeout有值(this.loginTimeoutCountdown > 0)且[connnectTimeout沒值(this.loginTimeoutCountdown > 0)或connnectTimeout值大于loginTimeout]則取值loginTimeout,否則取值connnectTimeout。也就是說這個方法取值思路是:兩者都有值時,在兩者中取較小的那個值作為最終的連接超時時間,兩者中只有一個有值時,取有值那個參數作為最終的連接超時時間。
既然說到這兒了,那么我們應該搞清楚connnectTimeout loginTimeout這兩個參數的來源是在哪兒?

1) loginTimeout

loginTimeout參數來源于驅動管理器的loginTimeout ,在com.mysql.cj.jdbc.ConnectionImpl#connectOneTryOnly方法中可以看到這個取值邏輯。

在這里插入圖片描述

貌似我們沒有給驅動管理器設置過登錄超時這參數,DriverManager#loginTimeout的默認值是0,不應該是30。
其實這DriverManager#loginTimeout現在的值是HikariCP連接池給我們設的默認值。HikariPool構造方法中初始化執行PoolBase#initializeDataSource時調用setLoginTimeout去給DriverManager設置登錄超時
在這里插入圖片描述
在這里插入圖片描述
上面PoolBase#setLoginTimeout(DataSource)方法中的dataSource 參數是com.zaxxer.hikari.util.DriverDataSource類的實例,而com.zaxxer.hikari.util.DriverDataSource#setLoginTimeout(int) 方法就是會直接給DriverManager的loginTimeout設值。

//com.zaxxer.hikari.util.DriverDataSource@Overridepublic void setLoginTimeout(int seconds) throws SQLException{DriverManager.setLoginTimeout(seconds);}

從下面的代碼可以看出,PoolBase#connectionTimeout屬性值來源于HikariConfig#connectionTimeout,而HikariConfig#connectionTimeout的屬性值又來源于配置文件中的spring.datasource.hikari.connection-timeout屬性值,若配置文件中的此屬性值為空,則取默認值30秒

  PoolBase(final HikariConfig config){this.config = config;//....//PoolBase#connectionTimeout來自HikariConfig#connectionTimeoutthis.connectionTimeout = config.getConnectionTimeout();this.validationTimeout = config.getValidationTimeout();this.lastConnectionFailure = new AtomicReference<>();//....initializeDataSource();}
public class HikariConfig implements HikariConfigMXBean
{private static final Logger LOGGER = LoggerFactory.getLogger(HikariConfig.class);private static final char[] ID_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();private static final long CONNECTION_TIMEOUT = SECONDS.toMillis(30);private static final long VALIDATION_TIMEOUT = SECONDS.toMillis(5);private static final long IDLE_TIMEOUT = MINUTES.toMillis(10);private static final long MAX_LIFETIME = MINUTES.toMillis(30);/*** Default constructor*/public HikariConfig(){dataSourceProperties = new Properties();healthCheckProperties = new Properties();minIdle = -1;maxPoolSize = -1;maxLifetime = MAX_LIFETIME;//默認值30秒connectionTimeout = CONNECTION_TIMEOUT;validationTimeout = VALIDATION_TIMEOUT;idleTimeout = IDLE_TIMEOUT;initializationFailTimeout = 1;isAutoCommit = true;String systemProp = System.getProperty("hikaricp.configurationFile");if (systemProp != null) {loadProperties(systemProp);}}
}

在這里插入圖片描述

2) connectTimeout

connectTimeout參數因為是在com.mysql.cj.conf.PropertyKey com.mysql.cj.conf.PropertyDefinitions類中定義的,它的默認值是0,即表示可以無限時長地連接等待;所以它需要在配置文件jdbc連接屬性spring.datasource.url上設值,如jdbc:mysql://localhost:3306/{xx_db}?connectTimeout={numTime}

在這里插入圖片描述
在這里插入圖片描述

3. socketTimeout

socketTimeout是socket超時時間,即讀超時。它在om.mysql.cj.conf.PropertyKey com.mysql.cj.conf.PropertyDefinitions`類中定義,默認值是0,它也是在jdbc連接url上配置。
在這里插入圖片描述

在這里插入圖片描述
的socketTimeout在com.mysql.cj.protocol.a.NativeSocketConnection#connect 方法中真正得以應用,本質上就是為Socket為SO_TIMEOUT選項設值,tcp/ip協議底層對SO_TIMEOUT提供了支持,這跟應用層mysql協議無關。而queryTimeout netTimeoutForStreamingResults參數都是應用層mysql協議對它的支撐。
在這里插入圖片描述
在這里插入圖片描述

4 queryTimeout

queryTimeout: sql執行超時。jdbc規范的Statement定義了這個超時時間(見java.sql.Statement#setQueryTimeout接口方法)
如果使用原生的jdbc,則需要手動調用ava.sql.Statement#setQueryTimeout設置sql執行超時。
國內實際上一般都使用mybatis這個orm框架,我們可以在配置文件中用mybatis.configuration.default-statement-timeout配置全局默認的queryTimeout,當然也可以在指定的Mapper方法中單獨配置queryTimeout(優先級比mybatis.configuration.default-statement-timeout高)
在這里插入圖片描述
mybatis框架 BaseStatementHandler#prepare中調用setStatementTimeout設值sql超時時間。
其邏輯是先取當前指定Statement的queryTimeout,若沒有則取全局默認的queryTimemout。然后把此值跟spring事務注解@Transactional配置的事務超時時間進行比較,最終的queryTimeout取兩者中較小的那個值。
在這里插入圖片描述

//StatementUtil
public static void applyTransactionTimeout(Statement statement, Integer queryTimeout, Integer transactionTimeout) throws SQLException {if (transactionTimeout == null) {return;}if (queryTimeout == null || queryTimeout == 0 || transactionTimeout < queryTimeout) {statement.setQueryTimeout(transactionTimeout);}}

接下來來看看queryTimeout的實現原理,ClientPreparedStatement#executeInternal方法在執行sql之前會調用startQueryTimer嘗試獲取一個CancelQueryTask超時任務 ,在執行完sql后嘗試取消這個超時任務的,如果在超時前完成了sql查詢,這時任務就被成功取消了,超時任務不會被執行。在這里插入圖片描述

startQueryTimer方法中的timeout參數是sql執行超時時間,PropertyKey.enableQueryTimeouts屬性默認值是true。因此只要sql執行超時不為空,就會創建一個CancelQueryTaskImpl任務,并且這個任務會在到達sql執行超時的時間線被執行(session.getCancelTimer().schedule(timeoutTask, timeout)延遲調度任務)在這里插入圖片描述
我們再往下看看這個CancelQueryTaskImpl任務是如何運行的。從下面的代碼可以看出,CancelQueryTaskImpl.run方法首先啟動了一個線程,然后在這個線程中執行sql腳本KILL QUERY {query_threadId}去殺掉這個查詢線程。***注意:***這里是每次sql執行都會啟動一個新線程,沒有使用線程池(應該是為了保證超時任務能得到及時的調度,線程池中的線程數是有限的,任務數過多就會放在任務隊列中,任務調度不可避免有一定延遲),在高并發的情況下會創建大量的線程,可能導致系統資源占用過高,甚至導致jvm虛擬機崩潰退出,所以在高并發環境中不建議使用sql執行超時這個功能。

在這里插入圖片描述

5. transactionTimeout 和 innodb_lock_wait_timeout

transactionTimeout :spring事務注解@Transactional的超時時間,上面說到了,這個值將會作為sql執行超時,可以說它是客戶端的事務超時參數,mysql本身是不支持事務超時的,mysql只有請求鎖超時概念,這個是spring框架實現的事務超時。
innodb_lock_wait_timeout: mysql server的環境變量,用于設置事務在等待獲取鎖時的超時時間。當一個事務請求鎖資源時,如果該資源已經被其他事務鎖定,那么該事務就會進入等待狀態。如果一個事務等待獲取鎖的時間超過了該設置的時間,MySQL 將會自動中斷該事務。

6. wait_timeout 和interactive_wait_timeout

wait_timeout: 數據庫服務端非交互式連接關閉前的等待時間。非交互鏈接是指JDBC等編程工具建立的數據庫連接。
interactive_wait_timeout: 數據庫服務端交互式連接關閉前的等待時間。交互式連接是指各種mysql UI客戶端建立的連接。
這兩個參數都是mysql server的環境變量,可以通過sql腳本set [GLOBAL] VARIABLES wait_timeout={timeNum};設置。
mysql的默認全局wait_timeout是86400秒,大致8小時。這個參數過大,可能導致mysql服務端一直有Sleep的空閑線程,連接得不到釋放。當然過它過小也會導致在執行sql腳本時數據庫連接被莫名的關閉,發生’MySQL server has gone away’這種異常。
HikariCP連接池有一個maxLifetime,這個參數表示一個連接的最大存活時間,達到這個閾值就JDBC客戶端就主動關閉這個連接。這里就避免了mysql客戶端wait_timeout有大量的空閑線程.

7. netTimeoutForStreamingResults

netTimeoutForStreamingResults:主要用來在處理流式結果集時mysql server返回大量數據的超時時間,防止等待結果集的時間過長。
在這里插入圖片描述
setupStreamingTimeout 根據流結果超時時間(PropertyKey.netTimeoutForStreamingResults的默認值是600)和是否需要流結果集方法createStreamingResultSet 來綜合判斷是否需要向服務端發送net_write_timeout屬性。
在這里插入圖片描述

  protected boolean createStreamingResultSet() {return ((this.query.getResultType() == Type.FORWARD_ONLY) && (this.resultSetConcurrency == java.sql.ResultSet.CONCUR_READ_ONLY)//getResultFetchSize默認值是0&& (this.query.getResultFetchSize() == Integer.MIN_VALUE));}

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

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

相關文章

uniapp小程序多線程 Worker 實戰【2024】

需求 最近遇到個小程序異步解碼的需求&#xff0c;采用了WebAssembly&#xff0c;涉及大量的計算。由于小程序的雙線程模型只有一個線程處理數據&#xff0c;因此智能尋求其它的解決方案。查看小程序的文檔&#xff0c;發現小程序還提供一個異步線程的Worker方案&#xff0c;可…

代碼隨想錄算法訓練營第25天|回溯

回溯part02 216. 組合總和 III /*** param {number} k* param {number} n* return {number[][]}*/ var combinationSum3 function(k, n) {// k個數字相加為n// 只能使用1-9// 每個數字只能使用一次// 不能重復 如 1 2 4 、 4 1 2 不可以let res [];backtracking(k, n, [], …

聯想Y410P跑大模型

安裝vs 2017 查看GPU版本 查看支持哪個版本的cuda windows cuda更新教程_cuda 12.0-CSDN博客 下載并安裝cuda tookit 10.1 CUDA Toolkit 10.1 Update 2 Archive | NVIDIA Developer 找到下載的文件&#xff0c;安裝 參考安裝鏈接 Win10 Vs2017 CUDA10.1安裝&#xff08;避坑…

Due to a bug fix in https://github.com/huggingface/transformers/pull/28687

錯誤&#xff1a; Due to a bug fix in https://github.com/huggingface/transformers/pull/28687 transcription using a multilingual Whisper will default to language detection followed by transcription instead of translation to English.This might be a breaking …

InnoDB存儲引擎非常重要的一個機制--MVCC(多版本并發控制)

Mysql是如何實現隔離性的&#xff1f;&#xff08;鎖MVCC&#xff09; 隔離性是指一個事務內部的操作以及操作的數據對正在進行的其他事務是隔離的&#xff0c;并發執行的各個事務之間不能相互干擾。隔離性可以防止多個事務并發執行時&#xff0c;可能存在交叉執行導致數據的不…

安全U盤和普通U盤有什么區別?

安全U盤&#xff08;也稱為加密U盤或安全閃存驅動器&#xff09;與普通U盤肯定是有一些區別的&#xff0c;從字面意思上來看&#xff0c;就能看出&#xff0c;安全U盤是能夠保護文件數據安全性的&#xff0c;普通U盤沒這一些功能的&#xff0c;可隨意拷貝文件&#xff0c;不防盜…

面試4:c++(數位物聯)

1.const 關健字的作用 定義常量&#xff0c;防止變量被意外修改&#xff0c;增強程序的可讀性和維護性。 可以用于指針&#xff0c;聲明指向常量的指針或常量指針。 2.static關健字的作用 (1)在函數內&#xff0c;用于修飾局部變量&#xff0c;使其生命周期延長到整個程序運行期…

mybatisplus多數據源內置方法報Invalid bound statement (not found)

在用mybatis-plus多數據源時用mapper內置的 selectList(queryWrapper) 查詢數據報org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 問題是在配置多數據源時用的是SqlSessionFactoryBean&#xff0c;改為MybatisSqlSessionFactoryBean即可…

Python怎么逐行處理文件:深度解析與實用技巧

Python怎么逐行處理文件&#xff1a;深度解析與實用技巧 在Python中&#xff0c;逐行處理文件是一項常見且重要的任務。無論是讀取大型日志文件、分析文本數據還是處理配置文件&#xff0c;逐行讀取都能幫助我們更有效地管理內存并提高處理速度。本文將詳細介紹Python中逐行處…

一文了解UVLED線光源的應用

在機器視覺系統中&#xff0c;光源作為不可或缺的一部分&#xff0c;能夠提高目標成像效果&#xff0c;增強檢測效果。光源的選擇至關重要&#xff0c;選到不合適的會影響成像及檢測效果。針對不同的檢測對象,不同的形狀光源應運而生。我們來看看最UVLED線光源。 下面以CCS的光…

某紅書旋轉滑塊驗證碼分析與協議算法實現

文章目錄 1. 寫在前面2. 接口分析3. 驗證軌跡4. 算法還原【??作者主頁】:吳秋霖 【??作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力于Python與爬蟲領域研究與開發工作! 【??作者推…

zoomeye api報錯 request invalid, validate usage and try again

項目場景&#xff1a; 調用zoomeye的api接口進行數據拿取 問題描述 之前接口一直通著今天突然報錯&#xff0c;以下為源代碼 pip install zoomeye from zoomeye.sdk import ZoomEye zm ZoomEye(api_key"34A8B452-D874-C63E0-8471-F3D4f89766f") zm.dork_search(a…

圖片像素縮放,支持個性化自定義與精準比例調整,讓圖像處理更輕松便捷!

圖片已經成為我們生活中不可或缺的一部分。無論是社交媒體的分享&#xff0c;還是工作文檔的編輯&#xff0c;圖片都扮演著至關重要的角色。然而&#xff0c;你是否曾經遇到過這樣的問題&#xff1a;一張高清大圖在上傳時卻受限于平臺的大小要求&#xff0c;或者一張小圖需要放…

Spring MVC 源碼分析之 DispatcherServlet#processDispatchResult方法

前言&#xff1a; 前面的篇章我們分析了 Spring MVC 工作流程中的 HandlerMapping、HandlerAdapter 的適配過程、攔截器的工作流程&#xff0c;以及處理業務請求的過程&#xff0c;本篇我們分析一下處理完業務解析視圖的方法&#xff0c;也就是 DispatcherServlet#processDisp…

提高篇(二):高級繪圖技巧:在Processing中創造精美圖形

提高篇(二):高級繪圖技巧:在Processing中創造精美圖形 引言 Processing不僅是一種編程語言,更是一個用于創意編程的強大工具。掌握高級繪圖技巧,可以讓你在藝術創作中如虎添翼。在本篇文章中,我們將探索貝塞爾曲線、樣條曲線、自定義形狀、圖形變換等高級繪圖技術,幫助…

tkinter+火山引擎+python實現語音識別聊天機器人

想要做一款能通過語音識別來聊天的智能機器人,首先需要能通過麥克風錄制語音進行識別轉換成文字,將文字發送給機器人得到聊天結果,并能將返回的文字轉換成語音進行合成,之后再通過本地播放語音實現語音交互。 架構: 實現步驟 一、本地錄音 本地錄音可以通過pyAudio庫實…

2024-06-05-記一次cnvd滲透

前言&#xff1a;挖src挖郁悶了&#xff0c;閑來無事選擇挖一個cnvd來練練手&#xff0c;本次的漏洞都沒啥難度&#xff0c;企查查資產過了5000萬 說一下cnvd證書的下放標準 對于中危及中危以上通用型漏洞&#xff08;CVSS2.0基準評分超過4.0分&#xff09;&#xff0c;以及涉…

Scaling vision Transformer 論文理解

Scaling vision Transformer 論文理解 1. 摘要2. 一些主要結論小結2.1 few shot transfer learning2.2 Pareto-front3. 討論3.1 Limitations3.2 社會作用4. 文章結論參考資料1. 摘要 Attention-based neural networks such as the Vision Transformer (ViT) have recently att…

valgrind-內存泄漏定位工具

1、前言 valgirnd 是一套開放源代碼的動態調試工具集合。能夠檢測內存管理錯誤&#xff0c;線程BUG等。valgirnd是由內核以及基于內核的其他調試工具組成。內核類似于一個框架&#xff0c;它模擬了一個cpu的環境&#xff0c;并提供服務給其他工具使用。而其他工具則類似于插件…

紅酒:紅酒保存中的光照與避免陽光直射

在紅酒保存中&#xff0c;光照是一個常常被忽視的因素。光照對紅酒的影響是不可小覷的&#xff0c;因為陽光中的紫外線會加速紅酒的氧化&#xff0c;導致其口感和品質的下降。因此&#xff0c;在保存云倉酒莊雷盛紅酒時&#xff0c;應特別注意避免陽光直射。 陽光直射對紅酒的影…