【问题标题】:Ping MySQL to keep connection alive in DjangoPing MySQL 以在 Django 中保持连接
【发布时间】:2013-11-01 10:45:27
【问题描述】:

我有一群工人在等待任务(使用 Django 作为 ORM)。我的问题是,如果在给定的时间内没有任务(无论 MySQL wait_timeout 变量设置为什么),MySQL 连接就会超时,因此工作人员会死亡。

我解决此问题的第一种方法是将 wait_timeout 增加到更高的整数,但我认为更好的解决方案可能是每 30 分钟左右 ping MySQL 一次,如果没有保持连接活动的任务。

所以我的问题是;如何使用 Django ORM 简单地 ping MySQL 以保持连接处于活动状态?这里的最佳做法是什么,只需做一个简单的愚蠢查询?

【问题讨论】:

  • 为什么你想保持这种联系?你更应该让员工在他们有事可做时进行联系。
  • @ProblemFactory 好点..你有任何伪代码可以用 Django 做到这一点吗?
  • 检查我的答案,如果你向我们展示你当前的工作代码,我会改进我的答案。

标签: python mysql django rabbitmq


【解决方案1】:

按照@ProblemFactory 的建议设置连接池或手动连接worker

http://dev.mysql.com/doc/refman/5.6/en/connector-python-connection-pooling.html

【讨论】:

  • 这里和Django无关,与MySQL和Python独立
【解决方案2】:

connection.connection.ping() 仅适用于 Oracle 和 MySQL,请勿使用。

正确的解决方案是:

from django.db import connection  # works with default connection only, use 'connections'

if connection.is_usable():
    print("ok")
else:
    print("error")

【讨论】:

  • 我有connection is None 条件(在is_usable() MySQL 内部)所以is_usable 引发了异常,所以需要包装在try:
【解决方案3】:
from django.db import connection

connection.connection.ping()

【讨论】:

    【解决方案4】:

    我和你遇到了同样的问题,通过以下代码解决:

    from django.db import connection
    connection.close()
    

    here是Django对这个问题的讨论。

    我将在此处粘贴该说明:

    建议的解决方案:当您知道您的程序将长时间空闲时,关闭与from django.db import connection; connection.close() 的连接。

    所以我认为你不必 ping MySQL 来保持连接处于活动状态,但是当工作线程长时间空闲(如等待任务)时你应该关闭连接,因为每次你做查询时,django会为你建立连接,但不会在工作线程等待或在没有数据库查询的情况下关闭连接。

    【讨论】:

      【解决方案5】:

      更好的主意是在需要时连接到您的数据库!尤其是你提到的间隔,比如 30 分钟。

      while true:
         sleep(X)
         if some_task:
            connect_to_DB()
            do_something()
      

      【讨论】:

      • 问题是我无法预测任务何时到达,在某个小时可能没有,在接下来可能有 1,000,000 个任务.. 所以我不想重新连接每个任务
      • 当然不是,你应该把task定义为一个完整的工作,而不是一个查询。
      • 即使一项任务被定义为一项完整的工作,但我的用例中的工作本身非常小,而且有很多......即使有这个定义也能完成任务
      【解决方案6】:

      Django 实际上会自动处理数据库连接(以及过期连接的重新连接)。

      这里的问题是我在我的一名工作人员 (https://docs.djangoproject.com/en/1.3/topics/db/transactions/#django.db.transaction.commit_manually) 中手动处理数据库事务,显然,这迫使您自己也处理整个数据库连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-06
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 2013-04-23
        • 2023-03-16
        相关资源
        最近更新 更多