Python程序长时间运行后断开数据库连接,如何排查及解决?

哦,我对此很熟悉。
一年前,我在上海搭建一个电子商务系统,由Python驱动,数据库是MySQL。
当时,系统运行一段时间后,总是发现数据库连接突然断开,导致调试起来非常困难。

当时我首先怀疑的是时机问题。
你是对的,MySQL的默认超时时间是8 小时,这确实令人困惑。
记得有一次,我半夜起床去洗手间,一摸手机,系统提示数据库连接丢失。
经过检查,哎,是参数问题造成的。
后来我增加了这个服务器参数,当程序运行时,我偶尔会ping一下连接,看看它是否还活着。
如果没有,请重新连接。

然后是互联网。
想一想,服务器在机房,我的开发机在办公室。
如果中间的光纤断了,那不是就断了吗?我编写了一个小脚本来 ping 数据库。
当我发现ping不通时,我主动断开当前的连接,并创建一个新的连接。
这个技巧非常有效。

但是有一次,我在北京参加一个会议,那段时间服务器负载非常高。
我一运行程序,CPU 就飙升至 1 00%。
这时候你会发现数据库连接根本无法建立。
即使设置了,操作也会完成。
当时我赶紧让运维兄弟加了两台服务器来分担负载,然后就搞定了。

我在代码错误方面也遇到过麻烦。
在我编写了更新函数但忘记添加异常处理之后。
如果数据库操作出错,甚至没有关闭就返回,那么连接就会泄漏。
后来我了解到,无论什么情况,我都需要确保连接最终关闭,即使我使用 try...finally 。

这是我第一次使用链接合并。
在使用之前,每次调用数据库都会创建一个新的连接,消耗资源非常快。
后来,我使用DBUtils库创建了一个连接池并设置了池大小,例如1 0个连接。
没关系,每次使用后将其放回池中,如果下次需要,则直接从池中取出。
不需要每次都创建一个新的,这样就省去了很多麻烦。
设置也很简单,只需几行代码。

我还在日志中添加了很多详细信息。
例如,如果连接失败,如果是超时或网络问题,请记下来。
这将使以后的故障排除更加容易。
我的服务器上有一个日志文件,记录与数据库相关的错误。
如果我半夜醒来一看,我就会知道问题出在哪里。

总体而言,此案是一个多方面的调查。
截止日期、网络、服务器负载、编码错误、连接池配置都需要考虑。
我一步步查了一下,先看最简单的东西,比如超时和网络,然后是服务器状态,最后看代码。
想通了,问题就解决了。

MySQL连接池配置及性能优化_提升数据库并发处理能力指南

前几天,我在一家小公司会议室和团队一起调试一个新项目的数据库连接池配置。
我们的旧服务器运行的是MySQL,因为业务量不是很大,但是团队的性能要求还是很高。
我们设置了连接池,但是一旦开启,系统经常会遇到连接超时的错误。

一开始我们只调整了最大连接数(maxPoolSize)和最小空闲连接数(minIdle),以为这样应该就可以了。
导致系统在高并发情况下仍然频繁出现连接超时的情况。
后来我们尝试调整连接超时和空闲超时,但这似乎没有效果。

突然有同事提到,是不是我们设置的连接池大小不够?因此,我们着手根据CPU核心数和数据库最大连接数来计算合理的连接池大小。
我记得是这样计算的:8 核CPU,根据实验公式,我们将maxPoolSize设置为1 6 到3 2 ,然后将minIdle设置为5
调整参数后,我们再次进行压力测试。
这次系统在高并发下表现好多了,几乎没有出现连接超时的错误。
等等,我突然想到我们以前从未设置过 ping 查询(验证查询)。
这不可能是问题吧?
总之,通过这次调试,我明白了配置MySQL连接池、提高性能的重要性。
但是,我也想知道,如果我们的业务量进一步增加,我们还需要做些什么来进一步完善我们的数据库连接池呢?

MySQL连接被重置,如何通过连接的可用性来保证连接池的有效性?

MySQL 连接池确实是一个令人头疼的问题。
我们需要讨论如何在连接重置时防止连接池挂掉,并且连接要稳定。

1 .设置连接超时时间。
这就像为您的连接设置闹钟一样。
例如,wait_timeout 参数是一个唤醒时钟,用于设置连接空闲时可以持续的时间量。
如果在此时间之后没有人使用它,连接池应该驱逐它并创建一个新的连接池。
这样可以防止数据库关闭长时间未交互的连接,降低连接重置的风险。
但这个时间不能设置得太短,因为这样会浪费资源,而且过于频繁地重新建立连接也是不可接受的。

2 .还必须进行体检。
连接池应该定期检查连接是否仍然活动。
例如,尝试发送像 SELECT1 这样的简单 SQL。
如果由于超时、错误等原因导致无法运行,请立即将其标记为错误,并且不要再次运行。
应根据性能和效率考虑来确定此检查的频率。
通常每分钟或每隔几分钟检查一次就足够了。

3 数据库和网络环境也需要优化。
在数据库端,应该适当调整max_connections和thread_cache_size等参数,以避免资源匮乏。
为了减少连接时间,还应该优化SQL执行效率。
网络必须稳定、低延迟、低丢包率。
例如,使用专线、负载均衡、TCPKeepalive等方式防止中间设备随机断开。

4 .日志记录和异常报警也很重要。
记录连接重置事件,包括时间、错误代码和连接ID,以便于问题分析。
设置阈值警报。
例如,如果每分钟重置次数超过 1 0 次,则会通知管理员快速采取行动。

5 连接池参数也必须适当配置。
根据系统负载和数据库性能动态调整连接池的大小。
如果太小,就没有足够的连接,用户就会变得不耐烦。
太大会浪费资源。
您将需要执行压力测试以确定最佳连接数并设置动态伸缩功能。

就是这样。
通过这些方法,可以有效控制连接重置问题,连接池也能稳定工作,保证应用程序与数据库的稳定交互。
说实话,这需要细心和耐心。
当时我无法理解这是怎么做到的。