对Mysql 超时配置项进行深入理解!

news2024/11/16 6:00:05

1 JDDB超时

JDBC 是 Java 应用程序中用于访问数据库的一套标准 API

类型4驱动是通过socket来处理字节流的。如果socket超时设置不合适,类型4驱动也可能有同样的错误(连接被阻塞)。

1.2 JDBC超时层次

应用程序WAS与数据库间的超时的层次

更上层的超时依赖于下层的超时,只有当较低层的超时机制正常工作,上层的超时才会正常。

1.2.1 事务超时

事务超时是在框架(Spring、EJB容器)或应用程序层面上才有效的超时。在 Spring 中,事务超时可以 XML文件配置或在 Java 代码中用 Transactional 注解来配置。

Spring 中数据库连接被保存在线程本地变量(ThreadLocal)中,这被称作事务同步(Transaction Synchronization)。当数据库连接被保存到 ThreadLocal 时,同时会记录事务的开始时间和超时时间。所以通过数据库连接的代理创建的 Statement 在执行时就会校验这个时间。

1.2.2 Statement 超时

Statement 超时是用来限制 Statement 的执行时间的,它的具体值是通过 JDBC API 来设置的。JDBC 驱动程序基于这个值进行 Statement 执行时的超时处理。Statement 超时是通过 JDBC API 中java.sql.Statement 类的 setQueryTimeout(int timeout) 方法配置的。不过现在更多是通过框架来进行设置。

以 iBatis 为例,可以通过 SqlMapConfig.xml 中的 settings 属性defaultStatementTimeout 来设置全局的statement超时缺省值。

也可以通过在具体的 sql 映射文件中的 select insert update 标签的 timeout 属性来覆盖。

JDBC的statement timeout处理过程

每个数据库和驱动程序的Statement超时的处理也是不同的。MySQL (5.0.8) 中的 Statement 超时处理如下:

  • 调用 Connection 的 createStatement() 方法创建一个 Statement 对象

  • 调用 Statement 的 executeQuery() 方法

  • Statement 通过内部的 Connection 将查询命令传输到 MySqlServer 数据库

  • Statement 创建一个新的超时执行线程(timeout-execution)来处理超时

  • 5.1以上版本改为每个连接分配一个线程

  • 向timeout-execution 线程注册当前的 Statement

  • 发生超时

  • timeout-execution 线程创建一个相同配置的 Connection

  • 用新创建的 Connection 发送取消查询的命令

1.2.3 JDBC的socket timeout

Socket超时可以通过 JDBC 驱动程序配置。通过设置 Socket 超时,可以防止出现网络错误时一直等待的情况并缩短故障时间。Socket 超时的值必须要高于 Statement 的超时时间,否则Socket超时将会先生效。

  • Socket 连接时的超时:通过 Socket 对象的 connect(SocketAddress endpoint, int timeout) 方法来配置

  • Socket 读写时的超时:通过 Socket 对象的 setSoTimeout(int timeout) 方法来配置

MySQL驱动的socket timeout配置方式

  • 连接超时配置 :connectTimeout(默认值:0,单位:ms)

  • Socket超时配置: socketTimeout(默认值:0,单位:ms)

示例: jdbc:mysql://xxx.xx.xxx.xxx:3306/database?connectTimeout=60000&socketTimeout=60000

也可以通过属性进行配置,而无需直接使用 DBCP 的 API 。

1.2.4 操作系统Socket超时

操作系统同样能够对socket timeout进行配置。通常,应用会在调用Socket.read()时由于网络问题被阻塞住,而很少在调用Socket.write()时进入waiting状态。如果系统内核缓冲区由于某种网络错误而满了的话,Socket.write()也会进入waiting状态。这种情况下,操作系统会尝试重新发包,当达到重试的时间限制时,将产生系统错误。

2 Mysql服务器超时配置

mysql>show variables like'%timeout%';
+-----------------------------+----------+| Variable_name               |Value|+-----------------------------+----------+| connect_timeout             |10|| delayed_insert_timeout      |300|| innodb_flush_log_at_timeout |1|| innodb_lock_wait_timeout    |50|| innodb_rollback_on_timeout  | OFF      || interactive_timeout         |28800|| lock_wait_timeout           |31536000|| net_read_timeout            |30|| net_write_timeout           |60|| rpl_stop_slave_timeout      |31536000|| slave_net_timeout           |3600|| wait_timeout                |28800|+-----------------------------+----------+复制代码

2.1 connect_timeout

connect_timeout指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒,之前版本默认是5秒。官方文档是这样说的:

connect_timeout: The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake. The default value is 10 seconds as of MySQL 5.0.52 and 5 seconds before that

connect timeout就是tcp连接超时 其中又分两种,一种是超过了自己设置的连接超时时间 一种是tcp层面连接sync包报文达到了重试次数报的超时, 两种超时错误提示信息是不一样的。

2.2 interactive_timeout & wait_timeout

wait_timeout和interactive_timeout都是指不活跃的连接超时时间,连接线程启动的时候wait_timeout会根据是交互模式还是非交互模式被设置为这两个值中的一个。如果我们运行mysql -uroot -p命令登陆到mysql,wait_timeout就会被设置为interactive_timeout的值

2.3 net_read_timeout & net_write_timeout

net_read_timeout和net_write_timeout这个参数只对TCP/IP链接有效,分别是数据库等待接收客户端发送网络包和发送网络包给客户端的超时时间

The number of seconds to wait for more data from a connection before aborting the read. When the server is reading from the client, net_read_timeout is the timeout value controlling when to abort. When the server is writing to the client, net_write_timeout is the timeout value controlling when to abort

这两个参数控制由于网络原因造成的异常超时。比如server在从client端读取大量的数据,读着读着突然发现读不到了,也没有遇到结束标识符,这种情况下,server在等待net_read_timeout秒还没读到后续数据,就断开连接;或者当server select出了大量数据发向客户端,发着发着,突然发现发不动了,客户端不接收了,而数据还没有发送完,这时server在等待net_write_timeout秒后就断开连接。

是mysql应用层的协议,而tcp的写超时只有在丢包次数过多才会。

3 Mysql客户端

示例

jdbc:mysql://192.168.1.8:3306/mytest?serverTimezone=GMT%2B8&autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&connectTimeout=60000&socketTimeout=60000复制代码

connectTimeout

建立链接需要的时间。该参数只在建立链接阶段生效。默认是0,不超时。建议配置connectTimeout=60000,单位毫秒。

socketTimeout

发送请求给数据库(建立链接后),数据库处理的最大时间;默认是0,不超时。建议配置socketTimeout=60000,单位毫秒。

超过这个客户端报超时超时异常Caused by: java.net.SocketTimeoutException: Read timed out。

autoReconnect

是否自动重连。默认false。mysql服务端参数wait_timeout,其默认值为 28800秒(8小时),其意义为如果一个连接闲置超过这个选项所设置的秒数,MySQL会主动断开这个连接。如果无法保证应用程序在设定的秒数内至少有一次操作,添加autoReconnect=true这个参数,即能解决这个问题。

maxReconnects

autoReconnect设置为true时,重试连接的次数,默认3。

initialTimeout

autoReconnect设置为true时,两次重连之间的时间间隔,默认2,单位:秒

4 Mysql连接池配置

4.1 Druid连接池配置

DruidDataSource参考配置github.com/alibaba/dru…

4.1.1 连接池的初始值、最大值、最小值

initialSize: 5minIdle: 6maxActive: 10复制代码

项目启动时,会自动初始化initialSize个连接出来(没有流量访问数据库也会创建),这几个链接会一直存在。可以通过数据库命令SHOW PROCESSLIST查看初始化的链接。

4.1.2 获取连接的等待时间

maxWait:6000复制代码

获取连接池中的连接时的最大等待时间,单位是毫秒。

如果这个时间内未获得可用链接则报错:nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 6000, active 10, maxActive 10, creating 0。这个报错表明获取链接超时了,而且数据库的10个链接都被占用,也不能创建新的链接了。

4.1.3 回收连接池中的链接

timeBetweenEvictionRunsMillis:2000minEvictableIdleTimeMillis:10000复制代码

每隔timeBetweenEvictionRunsMillis: 2000ms对连接池的连接做一次检查,如果有连接空闲时间超过minEvictableIdleTimeMillis: 10000ms就回收该链接。

4.1.4 校验链接池中的链接是否有效

validationQuery:SELECT1testWhileIdle:truetestOnBorrow:falsetestOnReturn:false
validationQueryTimeout:10复制代码

校验的方式:使用待校验的连接在在数据库上执行一下校验的sql,这里使用SELECT 1,一定要保证改sql是该数据能执行的,不同的数据库的校验sql可能不一样。

校验的时机:通常是在连接空闲时校验(testWhileIdle: true),

也可以在获取连接时校验(testOnBorrow: true,这个配置会降低性能),

也可以在归还连接到连接池时校验(testOnReturn: true,这个配置会降低性能)。

validationQueryTimeout是检测连接是否有效的超时时间,单位:秒。

如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。

4.1 HikariCP配置

4.2.1 连接池的最大值、最小值

maximumPoolSize:池中最大连接数,包括闲置和使用中的连接。默认为 10。如果 maxPoolSize 小于1,则会被重置。当 minIdle <=0 被重置为DEFAULT_POOL_SIZE 则为 10;如果 minIdle > 0 则重置为 minIdle 的值。

minimumIdle:控制连接池空闲连接的最小数量,当连接池空闲连接少于 minimumIdle,而且总共连接数不大于 maximumPoolSize 时,HikariCP 会尽力补充新的连接。为了性能考虑,不建议设置此值,而是让 HikariCP 把连接池当做固定大小的处理,默认 minimumIdle 与 maximumPoolSize 一样。当 minIdle < 0 或者 minIdle > maxPoolSize,则被重置为 maxPoolSize,该值默认为 10。

4.2.2 获取连接的等待时间

connectionTimeout:等待来自池的连接的最大毫秒数,默认为 30000 ms = 30 s,允许最小时间是 250 毫秒,如果小于 250 毫秒,则被重置回 30 秒。

4.2.3 超时时间

idleTimeout:连接允许在池中闲置的最长时间。

如果 idleTimeout + 1 秒 > maxLifetime 且 maxLifetime > 0,则会被重置为 0(代表永远不会退出);只有当 minimumIdle 小于 maximumPoolSize 时,这个参数才生效,当空闲连接数超过 minimumIdle,而且空闲时间超过 idleTimeout,则会被移除。

这是hikaricp用来判断是否应该从连接池移除空闲连接的一个重要的配置。负责剔除的也还是HouseKeeper这个定时任务,值为0时,HouseKeeper不会移除空闲连接,直到到达maxLifetime后,才会移除,默认值也就是0。

maxLifetime

池中连接最长生命周期。默认为 1800000, 30 分钟。Mysql 为了防止空闲连接浪费,占用资源,在超过wait_timeout 时间后,会主动关闭该连接,清理资源。但是hikaricp如何知道池子里维护的一把连接,有没有被mysql回收呢?所以就有了maxLifetime这个配置,官方也强烈建议必须按需设置此值!自然这个值也应该小于mysql的wait_timeout。那hikaricp在空闲连接超过maxLifetime,就会从连接池中剔除,防止业务进程取到了已关闭的连接,导致业务受损。

keepaliveTime & connectionTestQuery

keepaliveTime类比tcp的keepAlive机制。为了防止获取到被mysql关闭的无效连接,导致业务出错的一种兜底扫描方案。

具体过程就是每隔keepaliveTime时间间隔,去和数据库发送心跳,来探测连接是否有效。如果发现是无效的,就会及时从连接池中剔除,来保证业务进程获取到的都是有效连接。

如果配置了connectionTestQuery ,如 select 1, 心跳检查过程就会调用connectionTestQuery。

所以如果你配置了connectionTestQuery 但是没有配置keepaliveTime ,是没有用的,因为默认是关闭的。

而connectionTestQuery 配置项,官方建议如果驱动支持JDBC4,不要设置此属性!

因为相比于通过select查询方式探活,mysql 自带的ping命令 性能更高(直接在sql server返回结果,就不会做语法解析,执行优化,再通过存储引擎操作)。而基本上java mysql驱动包5以上的版本都支持JDBC4。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STL模拟实现——string

前言 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架。 STL有六大组件&#xff1a;算法&#xff0c;容器&#xff0c;迭代器&#xff0c;仿函数&am…

从0搭建一个WebRTC,实现多房间多对多通话,并实现屏幕录制

这篇文章开始会实现一个一对一WebRTC和多对多的WebRTC&#xff0c;以及基于屏幕共享的录制。本篇会实现信令和前端部分&#xff0c;信令使用fastity来搭建&#xff0c;前端部分使用Vue3来实现。 为什么要使用WebRTC WebRTC全称Web Real-Time Communication&#xff0c;是一种实…

安全狗重磅发布数据安全解决方案·数垒

一、 势在必行的数据安全 近年来&#xff0c;随着《网络安全法》、《数据安全法》、“数据二十条”等多部法律、意见法规等的相继颁布&#xff0c;数据安全管理与防护在国家政策上成为势在必行的行动之一。与此同时&#xff0c;伴随着数字经济时代的到来&#xff0c;数以万计…

Java基础语法-学习笔记

目录 01Java语言的发展 02Java的三大平台 03Java的主要特性 04JRE和JDK 1. 注释 使用的技巧 注意点 2. 关键字 2.1 概念 2.2 第一个关键字class 3. 字面量 区分技巧 4. 变量 4.1 什么是变量&#xff1f; 4.2 变量的定义格式 5. 数据类型 5.1 Java语言数据类型的…

STM32——TIM输出比较

文章目录一、TIM输出比较输出比较简介PWM简介输出比较通道(高级)输出比较通道(通用)输出比较模式控制器工作原理PWM基本结构参数计算三、PWM驱动LED呼吸灯电路设计关键代码关键函数与参数引脚重映射取消默认调试功能函数极性选择决定占空比&#xff0c;周期的三个函数四、PWM驱…

Design pattern-js的设计模式(一)

前言 什么是设计模式&#xff1f;&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间…

【youcans 的 OpenCV 例程 300篇】254.OpenCV 绘制图像标记

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】254. OpenCV 绘制标记 7.1 绘图函数基本参数 OpenCV提供了绘图功能&#xff0c;可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 函数 cv.line()、cv.rectangle()、cv.circle()、cv.polyli…

深度学习:08 训练、测试和验证集的说明

目录 用于深度学习的数据集 训练集 验证集 测试集 总结 用于深度学习的数据集 接下来&#xff0c;我将在这篇里面讨论在训练和测试神经网络期间使用的不同数据集。 出于模型的训练和测试目的&#xff0c;我们应该将数据分解为三个不同的数据集。这些数据集将包含以下内容…

【小f的刷题笔记】(JS)阶乘 - 阶乘后的零 LeetCode172 阶乘函数后K个零 LeetCode793

【阶乘】 一、阶乘后的零&#xff1a; LeetCode172 链接&#xff1a; 172.阶乘后的零 题目&#xff1a; 思路&#xff1a; 0的产生是一定是因为2*5产生的&#xff0c;所以就是找因数 并且&#xff0c;可想而知&#xff0c;找的到因数5&#xff0c;必然找的到因数2与之搭配…

【MySQL】深入理解B+树索引

文章目录1. 前言2. 索引方案3. InnoDB的索引方案4. 索引的分类4.1 聚簇索引4.2 二级索引4.3 联合索引5. InnoDB中的B树索引的注意事项5.1 内节点中目录项记录的唯一主5.2 一个页至少容纳2条记录6. MyISAM中的索引⽅案简单介绍1. 前言 索引&#xff0c;是MySQL快速查询的秘籍。…

ARMv8/ARMv9:深入理解MPIDR_EL1寄存器中的affinity

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈官方文档(ARM ARM文档)的介绍如下所示 翻译一下MPIDR_EL1相关的英文,如下所示: 作用: 在多处理器系统中,为调…

Xshell 连接虚拟机(Ubuntu、CentOS)

对于一些linux的初学者来说&#xff0c;在没有自己的服务器时可以选择使用虚拟机来代替&#xff08;如ubuntu、centos等&#xff09;进行相关的学习。下面介绍下如何使用xshell来远程连接虚拟机。 注意&#xff1a;下面我以Ubuntu来举例说明。 1、创建虚拟机 虚拟机的创建网络…

1、数据库安装修改root密码管理自启服务

MySQL的下载和安装 登录MySQL官网下载MySQL.zip包 MySQL :: Download MySQL Community Server 下载完毕可自行选择存储位置&#xff0c;进行解压 解压后配置环境变量 完成配置后在MySQL目录下新建一个my.ini配置文件 文件写入以下内容 [client] # 设置mysql客户端默认字符集…

面向对象2(static修饰变量和方法、Javabean类、测试类和工具类、对main方法的理解、继承、子类继承父类构造方法变量和方法)

1、static修饰变量和方法 JDK8以前&#xff0c;静态区在方法区里面&#xff0c;JDK8开始&#xff0c;静态区挪到了堆内存当中 理解&#xff1a; 因为静态方法没有this&#xff0c;而非静态方法是有一个隐含的参数this的&#xff0c;所以想在静态方法里面调用非静态变量或方法就…

电子招标采购系统源码之传统采购模式面临的挑战

采购类型多 采购制度&#xff1a;采购金额、部门、品类的差异导致管理标准不同。 采购流程&#xff1a;从供应商管理、寻源操作到合同签订、订单执行&#xff0c;业务流程长&#xff0c;审批节点多&#xff0c;传统管理透明度低&#xff0c;联动性差。 供应商管理难 寻源&#…

亚马逊云科技 Build On - Serverless助力企业降本增效

亚马逊云科技 Build On - Serverless开启零售新篇章梅开三度活动体验实验问题总结一点建议咖啡案例实验Serverless学习总结梅开三度 Hi,作为一名Builder&#xff0c;这也是第三次参加由AWS&CSDN共同举办的Build On活动&#xff0c;跟前几期一样&#xff0c;活动举办方也是…

Java集合ArrayList-学习笔记

目录 ArrayList 集合和数组的优势对比&#xff1a; 1.1 ArrayList类概述 1.2 ArrayList类常用方法 1.3 ArrayList存储字符串并遍历 1.4 ArrayList存储学生对象并遍历 1.5 查找用户的索引 1.6 判断用户的是否存在 ArrayList 集合和数组的优势对比&#xff1a; 集合长度可…

Ardupilot EKF3核心算法《状态量速度与位置预测方程》

目录 文章目录 目录摘要1. Ardupilot EKF3核心算法《状态量速度预测方程》2. Ardupilot EKF3核心算法《状态量位置预测方程》3. Ardupilot EKF3核心算法《状态量速度与位置预测方程》摘要 本节主要记录Ardupilot EKF3核心算法《状态量速度与位置预测方程》的过程,欢迎批评指正…

mysql生产数据库被误删

23年的头一天上班安装数据库&#xff0c;因为ssh工具来回切换失误&#xff0c;犯下不可饶恕的错误&#xff0c;居然将生产数据库全部删除&#xff0c;工作十几年头一次干这种蠢事&#xff0c;第一时间反应是一世英名毁于一旦&#xff0c;赶紧跑路。第二反应还是想办法看能否挽回…

aws eks 使用 cloudformation 创建并更新自管节点组

参考资料 更新现有自行管理的节点组 使用eks自管节点组能够最大程度控制节点的各项配置和参数&#xff0c;包括并不限于ami&#xff0c;节点类型等 但是使用自管节点也给用户带来了较大的维护和更新成本。对于节点组的更新操作&#xff0c;我们可以使用cloudformation的方式…