有时候在我们的生产环境中出现连接服务(这是使用MySQLdb的python程序)和mysql服务器之间的连接很乱,一些软件包丢失,一些黑魔法发生而MySQLdb.Cursor对象的.execute()永远不会结束(或花费大量时间结束)。
这非常糟糕,因为它浪费了服务工作者线程。有时它会导致工作人员的工作量减少,服务停止响应。
所以问题是:有没有办法在给定的时间后中断MySQLdb.Connection.execute操作?
答案 0 :(得分:2)
如果通信是这样的问题,可以考虑编写一个通过片状连接接收SQL命令的“代理”,并在可靠的通道上将它们中继到MySQL服务器(可能与MySQL服务器在同一个盒子上运行)。这样您就可以完全控制故障检测和重试。
答案 1 :(得分:1)
您需要准确分析问题所在。如果服务器消失,MySQL连接最终应该超时;通常启用TCP keepalive。您可以调整操作系统级别的TCP超时。
如果数据库是“片状”,那么你肯定需要调查如何。数据库似乎不太可能是问题,更有可能是两者之间的网络。
如果您使用(某些)任何类型的状态防火墙,它们可能会丢失一些状态,从而导致其他长期良好的连接失效。
您可能需要考虑更改MySQL中的idle timeout参数;否则,一个长期未使用的连接可能会“陈旧”,服务器和客户端都认为它仍然存在,但是其间的一些有状态网络元素已经“忘记”了TCP连接。试图使用这种“陈旧”连接的应用程序将在收到错误之前等待很长时间(但最终应该这样)。