我正在 Python 3.6 中使用 Peewee 运行 Django 项目,并尝试找出连接池的问题。我在开发服务器上不断收到以下错误(由于某种原因,我从未在本地计算机上遇到此问题):
Lost connection to MySQL server during query
重现步骤是可靠的,并且是:
- 在实例上重新启动 Apache。
- 转到我的 Django 页面并按下触发数据库操作的按钮。
- 工作正常。
- 等待 10 分钟(我已经进行了足够的测试以获得准确的数字)。
- 按另一个按钮可触发另一个数据库操作。
- 获取上面的丢失连接错误。
代码的结构使得我将所有数据库操作都放在一个独立的 Python 模块中,该模块被导入到 Django 模块中。
在主类构造函数中,我设置数据库如下:
from playhouse.pool import PooledMySQLDatabase
def __init__(self, host, database, user, password, stale_timeout=300):
self.mysql_db = PooledMySQLDatabase(host=host, database=database, user=user, password=password, stale_timeout=stale_timeout)
db_proxy.initialize(self.mysql_db)
每个需要调用数据库的调用都是这样完成的:
def get_user_by_id(self, user_id):
db_proxy.connect(reuse_if_open=True)
user = (User.get(User.user_id == user_id))
db_proxy.close()
return {'id': user.user_id, 'first_name': user.first_name, 'last_name': user.last_name, 'email': user.email }
我查看了 MySQL 实例上的 wait_timeout
值,其值为 3600,因此这似乎不是问题(并且我尝试更改它只是为了看看)。
关于我在这里可能做错了什么有什么想法吗?
更新:
我发现 MySQL 的 /etc/my.cnf
配置文件将 wait-timeout
值设置为 600,这与我遇到的情况相符。我不知道为什么当我在 MySQL DB(返回 3600)上运行SHOW VARIABLES LIKE 'wait_timeout';
时不显示该值,但问题似乎确实来自于等待超时。
鉴于此,我尝试将陈旧超时设置为 60,假设如果它小于等待超时,则可能会解决问题,但没有什么区别。
最佳答案
您需要确保正确回收连接 - 这意味着当请求开始时您打开一个连接,当响应传递时您关闭连接。池很可能不会回收 conn,因为您永远不会将其放回池中,因此看起来它仍在“使用中”。这可以通过中间件轻松完成,如下所述:
http://docs.peewee-orm.com/en/latest/peewee/database.html#django
关于python - Django 与 Peewee 连接池 MySQL 断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53395272/