mysql数据库响应超时怎么办

mysql数据库响应超时怎么办,第1张

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 5720 的源码进行了一些分析。

使用 GDB 调试代码找了实际与 mysql server 通信的代码,如下:

其中 vio_read() 函数中,使用 recv 和 poll 来读取报文和做读取超时。net_should_retry() 函数只有在发生 EINTR 时才会返回 true。从这段代码来看是符合测试结果的,并没有对读取进行三次重试。只有在读取 *** 作被系统中断打断时才会重试,但是这个重试并没有次数限制。

从上面代码的分析可以看出,代码的逻辑和文档的描述不符。于是在一顿搜索后,找到了一个 MySQL 的 BUG(Bug #31163)。该 BUG 报告了在 MySQL 50 中,MySQL c api 读取的实际超时时间是设置的三倍,与现有文档描述相符。于是对 MySQL 5096 的代码又进行分析。

同样使用 GDB 找到了通信部分的代码。这次找到了重试三次的代码,如下:

这个版本的 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 的维护者们在后续版本更新时忘记更新文档吧。

数据库的存在让我们在实施用户运营和软件维护方面有了很多详细的数据内容作为依据,今天我们就一起来了解一下,开发数据库都有哪些常见的存储媒体可以使用。

Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库、缓存服务或消息服务使用。

Redis支持多种数据结构,包括字符串、哈希表、链表、集合、有序集合、位图、Hyperloglogs等。

Redis具备LRU淘汰、事务实现、以及不同级别的硬盘持久化等能力,并且支持副本集和通过RedisSentinel实现的高可用方案,同时还支持通过RedisCluster实现的数据自动分片能力。

Redis的主要功能都基于单线程模型实现,也就是说Redis使用一个线程来服务所有的客户端请求,同时Redis采用了非阻塞式IO,并精细地优化各种命令的算法时间复杂度,这些信息意味着:

Redis是线程安全的(因为只有一个线程),其所有 *** 作都是原子的,不会因并发产生数据异常

Redis的速度非常快(因为使用非阻塞式IO,且大部分命令的算法时间复杂度都是O(1))

使用高耗时的Redis命令是很危险的,会占用的一个线程的大量处理时间,导致所有的请求都被拖慢。(例如时间复杂度为O(N)的KEYS命令,严格禁止在生产环境中使用)

Key

Redis采用Key-Value型的基本数据结构,沙河java培训发现任何二进制序列都可以作为Redis的Key使用(例如普通的字符串或一张JPEG)

关于Key的一些注意事项:

不要使用过长的Key。例如使用一个1024字节的key就不是一个好主意,不仅会消耗更多的内存,还会导致查找的效率降低

1设置内存大小,防止内存溢出

2利用缓存:redis管道(Pipelining)。非阻塞请求/响应服务器能够实现异步处理,即使旧的请求还未被响应,也能处理新的请求。

3批次插入,如:每1000条执行一次批量插入语句

4使用事务提高插入性能

使用事务可以在插入出错时进行回滚。

且在进行一个INSERT *** 作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理 *** 作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交 *** 作。

Java NIO 是一种非阻塞式I/O。

要理解 NIO,要先理解 非阻塞式I/O。

非阻塞式I/O 只是众多 IO 模型中的一种。

要透切理解 非阻塞式I/O,就要理解众多 IO 模型的历史和优劣。

要理解为什么会出现 这么多 IO 模型。

就要理解 计算机的 IO 系统和 *** 作系统如何处理 IO的。

以上就是关于mysql数据库响应超时怎么办全部的内容,包括:mysql数据库响应超时怎么办、关于存储媒体的介绍、解决大量数据插入数据库导致报错、超时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10093566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存