在多线程脚本中使用Django的持久连接如何关闭数据库连接?

11
Django 1.6引入了持久连接特性。但是我注意到退出使用django的ORM的脚本时,至少有一些连接在db端保持打开状态。
设置:django 1.6.0,postgres 9.2和psycopg2 2.5.1。
如何从脚本中优雅地关闭与数据库的连接? 注意事项部分提到,django每个线程打开一个连接,因此在多线程脚本中,django是否为每个线程创建一个连接,即使对于不访问db的线程?
每个线程需要单独关闭db连接吗?
如果上述两个问题的答案都是肯定的,那么对于不加入脚本退出的守护线程(例如用于通信的线程),您可以做什么?

1
嗨,我正在使用类似的设置,并遇到了悬挂连接的相同问题。你找到了解决这个问题的方法吗? - user1102018
2个回答

13

我刚才遇到了同样的问题...

当我的线程退出时,通过调用以下代码解决了这个问题:

from django.db import close_old_connections
close_old_connections()

5
这个答案没有涉及到多线程复杂性的问题。 - Jonathan Livni

7
我刚进行了升级,在启动子进程之前,主进程中的 close_old_connections 不像旧的 close_connections 一样工作,无法为每个进程提供自己的连接。但是,如果你看一下 close_connections 的旧操作,你可以通过文档重新创建它。

因此,在创建我的子进程之前,我在主进程中执行此操作。

from django.db import connections
for conn in connections.all():
    conn.close()

它非常好用。新的close_old_connections只会在连接过期或失效时关闭连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接