有时,我使用connection.cursor()而不是ORM执行原始查询(因为它绝对不是灵丹妙药).

我注意到,在一些地方,我在处理完数据库后不会称之为显式cursor.close().到目前为止,这还没有导致任何错误或性能问题.我想知道如果不明确关闭光标,我可能会遇到什么样的问题,会出现什么问题?

据我所知,Django中的connectioncursor遵循"Python数据库API规范v2.0"(PEP-249).并且,根据它,每当调用__del__()方法时,cursor将自动关闭.我想问题还可能是:当它不被调用时,是否存在用例?

仅供参考,我正在使用Python 2.7和Django 1.6.5.

推荐答案

100/101:

  1. __del__不一定会被叫来
  2. 有些数据库不调用游标.接近__del__(错误的做法,但正确)
  3. 有些数据库实际上并不在CONNECTION函数中创建连接,而是在游标函数中创建连接(例如,对于2&;3:pyhive的presto[可能他们已经对其进行了修补])

On server connections in general

大多数服务器都有空闲超时配置属性(我们称其为T).如果连接空闲超过T秒,服务器将删除该连接.大多数服务器还具有设置工作线程池大小(W)的属性.如果您已经与服务器建立了W个连接,则在try 新连接时可能会挂起.第二,假设您没有显式关闭连接的选项.在这种情况下,您必须将超时设置得足够小,以使您的工作者池永远不会被完全使用,这是您有多少并发连接的函数.

但是,如果您确实关闭了游标/连接(即使上面[3]不是等价的,它们的行为方式也是相似的),那么您就不必管理这些服务器配置属性,您的线程池只需要足够大来管理所有并发连接(可以 Select 偶尔等待新资源).我看到一些服务器(例如Cassandra上的Titan)无法从线程池中耗尽的工作线程中恢复,因此整个服务器都会关闭,直到重新启动.

TL/DR

Django相关问答推荐

Django迁移嵌套模型时出错,不带迁移基本模型

如何在Django表单中传递self.请求数据?

如何从列中捕获数据并将其添加到下拉菜单中,以便表单填充另一个表

反向 url django 管理员

在Django测试get方法中获取HttpResponseNotFound

在 Django Rest Framework 视图中,request.user 是在请求​​到达视图之前进行数据库调用还是数据库调用发生?

Django ORM 和锁定表

Django RESTful API - django-piston vs. django-tastypie

django - 让用户登录到测试客户端

验证 Django 模型对象的正确方法?

可以在 github 页面上托管 django 站点吗?

Django:如何使用动态(非模型)数据预填充 FormView?

如何使用 django-nose 运行单个测试或单个 TestCase?

引发 404 并继续 URL 链

过滤 Django 数据库中包含数组中任何值的字段

Django模板转换为字符串

在 Django REST 框架序列化程序中动态排除或包含字段

Django Admin - save_model 方法 - 如何检测字段是否已更改?

如何更改 ModelForm 中所有 Django 日期字段的默认小部件?

如何从 django 请求中获取完整的 url