MySQL read-c_技术分享 | MySQL C API 参数 MYSQL_OPT_READ_TIMEOUT 的一些行为分析

作者:戴岳兵

MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中,该参数的描述是这样的:

MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)

The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.

也就是说在需要的时候,实际的超时时间会是设定值的 3 倍。但是实际测试后发现实际的超时时间和设置的超时时间一致。而具体什么时候发生三倍超时,在文档中没有找到。所以对 MySQL 5.7.20 的源码进行了一些分析。使用 GDB 调试代码找了实际与 mysql server 通信的代码,如下:

68364c006e8822399233225e354acb37.png

其中 vio_read() 函数中,使用 recv 和 poll 来读取报文和做读取超时。net_should_retry() 函数只有在发生 EINTR 时才会返回 true。从这段代码来看是符合测试结果的,并没有对读取进行三次重试。只有在读取操作被系统中断打断时才会重试,但是这个重试并没有次数限制。从上面代码的分析可以看出,代码的逻辑和文档的描述不符。于是在一顿搜索后,找到了一个 MySQL 的 BUG(Bug #31163)。该 BUG 报告了在 MySQL 5.0 中,MySQL c api 读取的实际超时时间是设置的三倍,与现有文档描述相符。于是对 MySQL 5.0.96 的代码又进行分析。同样使用 GDB 找到了通信部分的代码。这次找到了重试三次的代码,如下:

65e2956a926dde8cd8b8ebee261e340e.png

这个版本的 MySQL api 的读写超时是直接使用的 setsockopt 设置的。第一次循环,在 A 点发生了第一次超时(虽然注释写的非阻塞,但是客户端的连接始终是阻塞模式的)。然后在 B 点将该 socket 设置为阻塞模式,C 点这里重置 retry 次数。由于设置了 alarm 第二次以后的循环会直接进入 D 点的这个分支,并且判断循环次数。作为客户端时 net->retry_count 始终是 1,所以重试了两次,共计进行了 3 次 vioread 后从 E 点退出函数。由上面的分析可知,MySQL 文档对于该参数的描述已经过时,现在的 MYSQL_OPT_READ_TIMEOUT 并不会出现三倍超时的问题。而 Bug #31163 中的处理结果也是将文档中该参数的描述更新为实际读取超时时间是设定时间的三倍。也许是 MySQL 的维护者们在后续版本更新时忘记更新文档吧。

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

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

相关文章

mysql出现core dumped_mysql-为什么我遇到分段错误(核心已转储)?

这是我要运行的代码.它可以编译,并且工作良好,直到昨天.#include #include int main(int argc, char **argv){MYSQL *conn;MYSQL_RES *result;MYSQL_ROW row;int num_fields;int i;conn mysql_init(NULL);mysql_real_connect(conn, "hostname", "username"…

mysql解释中fitered_MySQL的explain中的参数说明

1、id每个被独立执行的操作的标识,表示对象被操作的顺序;id值大,先被执行;如果相同,执行顺序从上到下。若没有子查询和联合查询,id则都是1。Mysql会按照id从大到小的顺序执行query,在id相同的情…

vue脚手架搭建项目_复习之vue脚手架搭建项目的两种方法

安装脚手架node 版本要求: > 8.9 。关于旧版本:如果在这之前已经全局安装了旧版本的vue-cli(1.x 或 2.x),那么需要先卸载掉。卸载旧版本运行:npm uninstall vue-cli -g 或 yarn global remove vue-cli。安装vue/cli&#xff1a…

ubuntu修改mysql账户密码_Ubuntu修改mysql用户重置密码

编辑mysql的配置文件/etc/mysql/my.cnf,或者/etc/mysql//mysql.conf.d/mysqld.cnf,在[mysqld]段下加入一行“skip-grant-tables”。1、安装$ sudo apt-get install mysql-server$ apt install mysql-client$ apt install libmysqlclient-dev以此在终端输入上述代码&…

pythonsocket中tcp通信接收不到数据_TCP 为什么三次握手而不是两次握手(正解版)...

先说结论为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始…

mysql高级查询面试_高级MySQL数据库面试问题 附答案

因为有大家的支持,我们才能做到现在,感谢你们这一路上对我们的支持.在这篇文章中,我们将主要针对MySQL的实用技巧,讲讲面试中相关的问题.1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称?答&#xf…

ecshop清除mysql缓存_ECSHOP缓存清理关闭教程

ECSHOP的缓存存放在templates/caches/文章夹下,时间长了这个文件夹就会非常庞大,拖慢网站速度。还有很多情况我们不需要他的缓存。本文介绍禁用ECSHOP缓存的方法。ECSHOP的缓存有两部分,一部分是SMARTY的页面缓存;另一部分是SQL查…

mysql无法启动如何备份文件_mysql 5.7 停电导致无法启动、如何备份数据,重新安装mysql...

用于记录服务器停电导致,mysql启动失败后,如何备份数据,重新安装mysql,主要分为数据备份,mysql重新安装。1、mysql无法启动时,进行数据备份。执行:systemctl start mysqld,启动失败。…

python tkinter entry默认值_Python ---(六)Tkinter窗口组件:Entry

The Tkinter Entry Widget##简介Entry(输入框)组件通常用于获取用户的输入文本。##何时使用 Entry 组件?Entry 组件仅允许用于输入一行文本,如果用于输入的字符串长度比该组件可显示空间更长,那内容将被滚动。这意味着该字符串将不能被全部看…

java不显示图片_Java图片显示不出来,怎么解决

展开全部有两个问题:图片路径没有写对,图片在 src 下,图片路径应是 src/海洋.png,正e68a84e8a2ad62616964757a686964616f31333365656632确的写法应是 image new ImageIcon("src/海洋.png")image new ImageIcon("…

memcached的java客户端_Memcached Java客户端

代码示例:import com.danga.MemCached.*;import org.apache.log4j.*;public class TestMemcached {public static void main(String[] args) {/*初始化SockIOPool,管理memcached的连接池*/String[] servers { "192.168.1.20:12111" };SockIOP…

java 静态块初始化_简单了解java中静态初始化块的执行顺序

这篇文章主要介绍了简单了解java中静态初始化块的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下在java中,其应该是先于所有的方法执行。下面是测试代码:public class Test1 {st…

java 接口访问权限_Java中访问权限-类和接口

(1)类和接口的访问权限种类一样 ,有两中public,default,它们的不同在于是否能访问不同包中的类或接口default:只能在本包中访问public:任何地方都可以访问,当然不同的包中,首先要import,导入类。(2)类中成员或方法的访…

java 代理ip工具类_Java基础之java处理ip的工具类

java处理ip的工具类,包括把long类型的Ip转为一般Ip类型、把xx.xx.xx.xx类型的转为long类型、根据掩码位获取掩码、根据 ip/掩码位 计算IP段的起始IP、根据 ip/掩码位 计算IP段的终止IP等方法,可以直接使用!package com.hh.test;import java.u…

java smack 例子_java+smack+openfire即时通讯Im(四)

### javasmackopenfire即时通讯Im(四) ###* 创建群聊* 加入群聊# 创建群聊 #前面的单聊完成以后,就开始群聊的功能把,首先是创建群聊:后端进行群组创建:/***** 方法名称:createMutiUserChat* 概要说明:创建…

java 常量区存放 new_java---堆、栈、常量池的存储数据

说到Java中堆、栈和常量池,首先还是看看他们各自存放的数据类型吧!栈:Java的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)也叫静态存储区。堆区:(存放所有new出来的对象;)1.存储的全部是对象&#xff0c…

log加时间 securecrt_SecureCRT配置自动记录日志

很多人用SecureCRT时,希望自动记录日志,一个是方便以后查阅,一个是对自己的操作有个记录。可以看看自己做了什么操作,有时甚至可以看看之前是不是犯了什么错,是个很不错的功能。设置很简单,还可以根据连接的…

java txt 按行读取_java读取按行txt文件

import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;public class T {public static void main(String[] args) throws Exception{long startTimeSystem.currentTimeMillis(); //获取开始时间FileInputStream filestreamnew File…

java泛型改进_java泛型高级篇 - 真正理解协变与逆变 | 鱼儿的博客

无论你是否听过java泛型的协变与逆变,我们直接进入例子,一起来看一下java泛型比较高级的用法。例子1:copy函数第1个例子我们实现copy函数,它将List中的元素复制到List中。JavaList src Arrays.asList(1,2,3,4,5);List dst new A…

java中br.readline_java中br.readLine与 br.read的用法有什么区别??

报错?请发送错误信息为了帮助理解我写了一个测试类,请参照import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class T0517 {public static void main(String[] args) {FileReader input;try …