Pylons错误 - 'MySQL服务器已断开连接

16 投票
2 回答
3760 浏览
提问于 2025-04-11 00:02

我正在使用Pylons(一个Python框架)来提供一个简单的网页应用,但它似乎时不时就会崩溃,错误日志里显示:(2006, 'MySQL服务器已经断开连接')

我查了一下,发现这是因为与MySQL的连接没有被更新。其实这不应该是个问题,因为配置文件里的sqlalchemy.pool_recycle应该会自动保持连接活跃。默认值是3600,但我把它调低到1800,因为这个问题。这样做稍微有点帮助,但根据文档,3600 应该是没问题的。错误还是会时不时出现。我也不想把这个值调得太低,以免自己把数据库搞瘫痪 :)。

也许是我的MySQL配置有问题?我不太确定该从哪里入手。

其他相关细节:

  Python 2.5
  Pylons: 0.9.6.2 (w/ sql_alchemy)
  MySQL: 5.0.51

2 个回答

2

你可能需要查看一下MySQL的超时设置:

show variables like '%timeout%';

你可能对 wait_timeout 感兴趣(还有一个不太常见的 interactive_timeout)。在Debian和Ubuntu系统上,默认的超时时间是28800秒,也就是MySQL会在8小时后自动断开连接。不过,可能你使用的系统默认设置不同,或者服务器的管理员做了不同的配置。

据我了解,pool_recycle 并不会让连接一直保持活跃,它会在MySQL断开之前自己先让连接过期。我对pylons不太熟悉,但如果可以让连接间歇性地执行 SELECT 1;,那样可以保持连接活跃,而且几乎不会增加服务器负担和网络流量。最后一个想法是:你是否在使用一个pylons认为已经过期的连接?

8

我想我解决了这个问题。原来我只是配置文件写错了。我的 ini 文件内容是:

sqlalchemy.default.url = [connection string here]
sqlalchemy.pool_recycle = 1800

问题在于我的 environment.py 文件里声明引擎只会处理以 sqlalchemy.default 开头的键,所以 pool_recycle 被忽略了。

解决办法就是把 ini 文件的第二行改成:

sqlalchemy.default.pool_recycle = 1800

撰写回答