6

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

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

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

4

6 回答 6

2

按照@ProblemFactory 的建议设置连接池或手动连接工作人员

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

于 2013-11-01T11:02:26.773 回答
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")
于 2019-12-05T04:05:14.483 回答
1
from django.db import connection

connection.connection.ping()
于 2016-09-11T06:14:01.000 回答
1

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

from django.db import connection
connection.close()

这是 Django 对这个问题的讨论

我将在此处粘贴该解释:

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

所以我认为你不必 ping MySQL 来保持连接活跃,但是你应该在工作线程空闲很长时间(比如等待任务)时关闭连接,因为每次你做查询时,django 都会建立一个为您连接,但是当工作线程等待或在没有数据库查询的情况下执行某些操作时,它不会关闭连接。

于 2020-06-15T03:31:25.447 回答
0

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

while true:
   sleep(X)
   if some_task:
      connect_to_DB()
      do_something()
于 2013-11-01T11:11:18.613 回答
0

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

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

于 2013-11-07T12:36:09.223 回答