AFAIK在Django 1.6中,光标在请求之间共享,并在需要时打开新连接。但是我找不到有关connection.cursor()方法如何工作的任何信息,以及如何在文档中的不同进程中使用connection.cursor()方法。
我见过的大多数代码都没有关闭从connection.cursor()返回的游标对象,所以我假设Django在请求完成时自动关闭从connection.cursor()返回的游标对象,但是如果我调用连接怎么办? .cursor()在不同的进程中?我应该在终止进程时关闭该游标,否则游标的包装函数会自动终止?
答案 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