在Django 1.6中connection.cursor()线程安全吗?

时间:2013-12-11 22:31:42

标签: python django cursor multiprocessing django-database

AFAIK在Django 1.6中,光标在请求之间共享,并在需要时打开新连接。但是我找不到有关connection.cursor()方法如何工作的任何信息,以及如何在文档中的不同进程中使用connection.cursor()方法。

我见过的大多数代码都没有关闭从connection.cursor()返回的游标对象,所以我假设Django在请求完成时自动关闭从connection.cursor()返回的游标对象,但是如果我调用连接怎么办? .cursor()在不同的进程中?我应该在终止进程时关闭该游标,否则游标的包装函数会自动终止?

1 个答案:

答案 0 :(得分:4)

线程安全依赖于数据库连接实现,有关可能的情况,请参阅Python Database API Specification v2.0

  

threadsafety:整数常量,表示接口支持的线程安全级别。可能的值有:

threadsafety  Meaning
0             Threads may not share the module.
1             Threads may share the module, but not connections.
2             Threads may share the module and connections.
3             Threads may share the module, connections and cursors.

例如,MySQL,PostgreSQL和Oracle:

>>> import MySQLdb
>>> MySQLdb.threadsafety
1
>>> import psycopg2
>>> psycopg2.threadsafety
2
>>> import cx_Oracle
>>> cx_Oracle.threadsafety
2

因此似乎没有django支持的数据库连接在游标级别上是线程安全的。

通常,使用__del__方法关闭游标,即收集垃圾时,或者线程正常终止时(与其被杀死时相反,因为守护程序线程可能会结束)。我记得在特定平台上处理游标的一些错误,即oracle着名的ORA-01000 Too many cursors错误的一些问题。快速谷歌搜索显示Jython a bug,但我很确定我在CPython中也有问题。另请参阅this ticket