2

有时在我们的生产环境中,服务(即使用 MySQLdb 的 python 程序)和 mysql 服务器之间的连接不稳定,一些包丢失,一些黑魔法发生并且 MySQLdb.Cursor 对象的 .execute() 永远不会结束(或采取大量的时间结束)。

这非常糟糕,因为它浪费了服务工作线程。有时它会导致工人池耗尽,服务完全停止响应。

所以问题是:有没有办法在给定的时间后中断 MySQLdb.Connection.execute 操作?

4

2 回答 2

2

如果通信存在这样的问题,请考虑编写一个“代理”,通过不稳定的连接接收您的 SQL 命令,并通过可靠的通道将它们中继到 MySQL 服务器(可能与 MySQL 服务器在同一个盒子上运行)。这样您就可以完全控制故障检测和重试。

于 2008-10-12T23:45:47.060 回答
1

您需要准确分析问题所在。如果服务器不存在,MySQL 连接最终应该会超时;TCP keepalives 通常是启用的。您也许可以调整操作系统级别的 TCP 超时。

如果数据库“不稳定”,那么您肯定需要调查如何。数据库似乎不太可能真的是问题,更有可能是两者之间的网络问题。

如果您正在使用(某些)任何类型的状态防火墙,它们可能会丢失一些状态,从而导致原本良好的长期连接失效。

您可能需要考虑更改 MySQL 中的空闲超时参数;否则,长期未使用的连接可能会“过时”,服务器和客户端都认为它还活着,但中间的一些有状态的网络元素已经“忘记”了 TCP 连接。尝试使用这种“陈旧”连接的应用程序在收到错误之前将等待很长时间(但最终应该如此)。

于 2008-10-13T06:57:13.600 回答