深入理解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.mzph.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;应特别注意避免阳光直射。 阳光直射对红酒的影…