我们最近遇到了MySQL Server消失的错误。经过一周的调试,我们发现Django在启动时创建了一些持久连接,即使我们的CONN_MAX_AGE为0(一直为0)。
在启动时运行的查询是来自django-simple-history的查询以及一些关于模型形式的类级别的查询。由于这些形式以某种方式使其到达了url的导入,因此这些查询已在所有调用中执行(我知道非常糟糕,我们已修复了此问题)。现在奇怪的行为如下。
在启动时,这些类级别的查询以及来自django-simple-history的查询将创建与MySql的连接,但它们将是持久连接。启动期间正在这些连接上运行几个查询。现在,启动后,所有查询都将创建其连接,除了来自模型形式的查询。他们会回来并尝试使用旧的连接进行连接。
我们得到的错误是,如果应用程序在MySql的wait_timeout中处于空闲状态。 MySql将终止这些连接,而django将尝试使用相同的连接进行查询,因此 “ MySQL服务器已消失”
我们确实将类级别的查询移到了实例级别,这解决了并非在每个请求上都发生的查询。但是我们仍然不确定为什么这些类级别的查询会再次使用相同的连接(将相同的查询移到实例级别时会建立自己的新连接,并在执行后关闭它们)。