gpt4 book ai didi

python - Django 与 Peewee 连接池 MySQL 断开连接

转载 作者:行者123 更新时间:2023-12-01 08:43:36 31 4
gpt4 key购买 nike

我正在 Python 3.6 中使用 Peewee 运行 Django 项目,并尝试找出连接池的问题。我在开发服务器上不断收到以下错误(由于某种原因,我从未在本地计算机上遇到此问题):

Lost connection to MySQL server during query

重现步骤是可靠的,并且是:

  1. 在实例上重新启动 Apache。
  2. 转到我的 Django 页面并按下触发数据库操作的按钮。
  3. 工作正常。
  4. 等待 10 分钟(我已经进行了足够的测试以获得准确的数字)。
  5. 按另一个按钮可触发另一个数据库操作。
  6. 获取上面的丢失连接错误。

代码的结构使得我将所有数据库操作都放在一个独立的 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com