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

标签 python django python-3.x connection-pooling peewee

我正在 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/

相关文章:

python - 群论和 Python

python - 如何在 Django 2.0 中为变量提供随机值?

python - 当组名称在多列中时,pandas 前 n 个值

python - 在 Ubuntu 19.04 上安装 'pynusmv' 时出现问题

python - 保存对象时 Django mod_wsgi PicklingError

django - 覆盖 AppConfig.ready()

python - 如何知道我使用的 django 版本?是 1.0、1.1 还是 1.2?

python - 在 rebol 中是否有等同于 "continue"(python) 的东西?

python - 填充 Pandas 中其他列的邻居值的值

python - 非成员运算符重载(特别是运算符==)在 Cython 中是否被破坏?