Ping MySQL以保持Django中的连接

时间:2013-11-01 10:45:27

标签: python mysql django rabbitmq

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

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

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

6 个答案:

答案 0 :(得分:2)

按照@ProblemFactory

的建议设置连接池或手动连接工作程序

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

答案 1 :(得分:1)

from django.db import connection

connection.connection.ping()

答案 2 :(得分:1)

我也遇到了同样的问题,并通过以下代码解决了该问题:

from django.db import connection
connection.close()

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

我将在此处粘贴说明:

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

因此,我认为您不必对MySQL进行ping操作以保持连接有效,但是当工作线程长时间处于空闲状态(如等待任务)时,您应该关闭连接,因为每次执行查询时,django会为您建立一个连接,但是当工作线程等待或执行某些没有数据库查询的操作时,它不会关闭该连接。

答案 3 :(得分:0)

更好的想法就是在需要时连接到你的数据库!特别是你提到了30分钟的间隔时间。

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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")