深入理解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超时时间,即读超时。它在com.mysql.cj.conf.PropertyKeycom.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.rhkb.cn/news/342561.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose部署 kafka 3.7 集群(3台服务器)并启用账号密码认证

文章目录 1. 规划2. 服务部署2.1 kafka-012.2 kafka-022.3 kafka-032.4 启动服务 3. 测试3.1 kafkamap搭建&#xff08;测试工具&#xff09;3.2 测试 1. 规划 服务IPkafka-0110.10.xxx.199kafka-0210.10.xxx.198kafka-0310.10.xxx.197kafkamp10.10.xxx.199 2. 服务部署 2.1…

数据挖掘与机器学习——聚类算法

目录 无监督学习 聚类算法 概念&#xff1a; 功能&#xff1a; 应用场景&#xff1a; 评判标准&#xff1a; 划分聚类&#xff1a; K-means聚类 逻辑实现&#xff1a; 聚类方式 问题&#xff1a; 解决&#xff1a; 可能存在的问题&#xff1a; 1.初始值对K-means聚…

五个超实用的 ChatGPT-4o 提示词

GPT-4o 是 OpenAI 最近推出的最新人工智能模型&#xff0c;不仅具备大语言模型的能力&#xff0c;而且拥有多模态模型的看、读、说等能力&#xff0c;而且速度比 GPT-4 更快。下面我们就来介绍几个超实用的 GPT-4o 提示词&#xff0c;帮助大家更好地了解 GPT-4o 的功能和应用场…

度安讲 | 第二期「安全左移·业务护航」技术沙龙成功举办

当下&#xff0c;“安全左移”作为落地DevSecOps的重要实践之一&#xff0c;已在业界达成共识。DevSecOps作为一种集开发、安全、运维于一体的软件开发和运营模式&#xff0c;强调在敏捷交付下&#xff0c;“安全”在软件开发生命周期的全覆盖贯穿和核心位置。所谓“安全左移”…

ssh远程管理

SSH远程管理 ssh是一种安全通道协议&#xff0c;只能用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密。 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 端口号22 网络层 传输层 数据传输…

62. 不同路径

题目 一个机器人位于一个 m x n 网格的左上角&#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; …

Prompt工程与实践

Prompt工程与实践 一、Prompt与大模型 1.1 大模型的定义 大模型本质上就是一个概率生成模型&#xff0c;该模型的模型参数足够大&#xff0c;并且在训练过程中阅读了非常多的各个领域的语料。这个时候&#xff0c;如果通过一个正确的、有效的指令去引导这个模型&#xff0c;…

javascript导入excel文件

导入文件用到一个 xlsx.core.js 的包。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><script type"tex…

[Python]用Qt6和Pillow实现截图小工具

本文章主要讲述的内容是&#xff0c;使用python语言借助PyQt6和Pillow库进行简单截图工具的开发&#xff0c;含义一个简单的范围裁剪和软件界面。 主要解决的问题是&#xff0c;在高DPI显示屏下&#xff0c;坐标点的偏差导致QWidget显示图片不全、剪裁范围偏差问题。 适合有一点…

性能飙升50%,react-virtualized-list如何优化大数据集滚动渲染

在处理大规模数据集渲染时&#xff0c;前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer API&#xff0c;实现前端渲染性能飙升 50% 的突破&#xff01;除此之外&#xff0c;我们一同探究下该库还支持哪些新的特性…

前端传参数后端变量类型能够接受到List却无法接收到值

问题描述 今天写了个接口&#xff0c;下图所示 ReqVO里是这样的&#xff1a; 然后前端去请求&#xff0c;从请求结果中看发现这里值是在的&#xff08;有经验的可能就看出来了otherInfo.id: 这样以参数后端是接收不到的&#xff0c;但是当时没发现&#xff09; 传进来后端…

第二十六章CSS3续~

3.CSS3渐变属性 CSS3渐变(gradients)可以在两个或多个指定的颜色之间显示平稳的过渡。 以前&#xff0c;我们必须使用图像来实现这些效果。但是&#xff0c;通过使用CSS3渐变(gradients)&#xff0c;可以减少下载的事件和宽带的使用。由于渐变(gradient)是由浏览器生成的&…

初学者如何对大模型进行微调?

粗略地说&#xff0c;大模型训练有四个主要阶段&#xff1a;预训练、有监督微调、奖励建模、强化学习。 预训练消耗的时间占据了整个训练pipeline的99%&#xff0c;其他三个阶段是微调阶段&#xff0c;更多地遵循少量 GPU 和数小时或数天的路线。预训练对于算力和数据的要求非…

java第二十课 —— 面向对象习题

类与对象练习题 编写类 A01&#xff0c;定义方法 max&#xff0c;实现求某个 double 数组的最大值&#xff0c;并返回。 public class Chapter7{public static void main(String[] args){A01 m new A01();double[] doubleArray null;Double res m.max(doubleArray);if(res !…

【Qt知识】disconnect

在Qt框架中&#xff0c;disconnect函数用于断开信号与槽之间的连接。当不再需要某个信号触发特定槽函数时&#xff0c;或者为了防止内存泄漏和重复执行问题&#xff0c;你可以使用disconnect来取消这种关联。disconnect函数的基本用法可以根据不同的需求采用多种形式&#xff0…

【Python学习1】matplotlib和pandas库绘制人口数变化曲线

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 一、Python库说明 Matplotlib Matplotlib是一个功能强大的Python 2D绘图库&#xff0c;它允…

【Linux网络】传输层协议 - UDP

文章目录 一、传输层&#xff08;运输层&#xff09;运输层的特点复用和分用再谈端口号端口号范围划分认识知名端口号&#xff08;Well-Know Port Number&#xff09;两个问题① 一个进程是否可以绑定多个端口号&#xff1f;② 一个端口号是否可以被多个进程绑定&#xff1f; n…

最大的游戏交流社区Steam服务器意外宕机 玩家服务受影响

易采游戏网6月3日消息&#xff1a;众多Steam游戏玩家报告称&#xff0c;他们无法访问Steam平台上的个人资料、好友列表和社区市场等服务。同时&#xff0c;社区的讨论功能也无法正常使用。经过第三方网站SteamDB的确认&#xff0c;&#xff0c;这一现象是由于Steam社区服务器突…

德国西门子论未来质量管理 - 如何与明天相遇?

未来制造业的质量 -- 如何用软件方案满足质量要求 作者&#xff1a;Bill Butcher 翻译&编辑&#xff1a;数字化营销工兵 【前言】在Frost&Sullivan最近发表的一份白皮书中&#xff0c;他们讨论了制造业的质量投资。质量是制造过程的关键要素&#xff0c;但似乎比其他…

《精通ChatGPT:从入门到大师的Prompt指南》大纲目录

第一部分&#xff1a;入门指南 第1章&#xff1a;认识ChatGPT 1.1 ChatGPT是什么 1.2 ChatGPT的应用领域 1.3 为什么需要了解Prompt 第2章&#xff1a;Prompt的基本概念 2.1 什么是Prompt 2.2 好Prompt的特征 2.3 常见的Prompt类型 第二部分&#xff1a;Prompt设计技巧 第…