我有一群工人在等待任务(使用Django作为ORM)。我的问题是,如果在给定的时间内没有任务(无论MySQL wait_timeout变量设置为什么),MySQL连接都会超时,因此工作人员会死亡。
我解决这个问题的第一种方法是简单地将wait_timeout增加到更高的整数,但我认为更好的解决方案可能是每30分钟左右ping一次MySQL,如果没有任务保持连接活着的话。 / p>
所以我的问题是;我如何使用Django ORM简单地ping MySQL以保持连接活着?这里最好的做法是什么,只做一个简单的愚蠢查询?
答案 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")