本文编写于 100 天前,最后修改于 85 天前,其中某些信息可能已经过时。

先看结果

闷了挺久,结果觉得自己挺弱智的……其实是对DBPool有误解(
每个线程,公用一个连接,资源被占用时就等待,这样并发数量就会下降。
思路很正确,但是在实现过程中我憨批了。
在多线程中的某一个线程中,连接需要被反复使用,例如在Python中,DBPool最好在线程initializer时就被创建,并在本线程中重复使用。否则,就会在短时间内创建大量数据库连接,也就失去了连接池的意义,还导致MariaDB不稳定。在如此密集的请求下,MariaDB经常出现各种奇怪的错误,所以尽量优化避免。

问题描述

这几天把之前做的一个小项目完善,试图变成毕业设计
然后把之前写的东西拿出来,先把数据重新跑出来一遍,然后跑着跑着,MySQL炸了…………
MySQLdb._exceptions.OperationalError: (2002, "Can't connect to MySQL server on '127.0.0.1' (10048)")


问题在建立连接上,使用了MySQLdb连接,在Util里写了一个getConn(),每次要写入数据的时候,都建立一次连接,并正常关闭连接。现在看起来是连接建立的太多才出的问题……大概连接一万三千多次之后就炸了,我设的最大连接数3000。
而且报错不是1040 too many connection,而是无法连接到,也就是说,MySQL不响应了,MySQL短暂地当掉了
可问题是,我在每个连接使用完毕之后,都好好地close()了!

再来看看MariaDB这边的日志,并没记录下什么有用的信息
2020-03-29 14:43:13 11988 [Warning] Aborted connection 11988 to db: 'showstart_netease' user: 'root' host: 'localhost' (Got an error reading communication packets)

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE "Aborted%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Aborted_clients          | 2     |
| Aborted_connects         | 0     |
| Aborted_connects_preauth | 0     |
+--------------------------+-------+
3 rows in set (0.000 sec)

Aborted Clients表示客户端异常终止的计数,日志里也说是得到了错误的数据包,不知道是请求时的问题还是正常的连接被出现的异常中断了。

改为使用连接池,并没什么用,甚至还出现其他奇奇怪怪的问题,interfaceerror (0 '')之类的.
最终重写了一部分代码,把SQL操作往上拿了一级,直接从逻辑上减少连接的数量解决了问题。
但还是记录一下这个诡异的问题,毕竟这问题从高并发的角度肯定解决得了,希望日后能明白其中的机制彻底搞定。