Django持久数据库连接 - 一种不同的方法

时间:2011-12-14 10:19:32

标签: python mysql django mongodb mysql-python

我已经和Django persistent database connection类似的线程和其他相同主题的东西一样。 然而Django没有正式支持MySQL和Mongo的持久连接(据我所知)。所以我试图避免很多东西并试图让它变得简单。所以我做的是在我的views.py中创建了全局连接变量MongoDB和MySQL都是这样的:

from pymongo import Connection
import MySQLdb
global mongo_connection,mongo_db,collection,mysql_connection,mysql_cursor
mysql_connection = MySQLdb.connect (host = "localhost",
                       user = "root",
                       passwd = "password",
                       db = "demo")
mysql_cursor = mysql_connection.cursor ()
mongo_connection = Connection()
mongo_db = mongo_connection.test_database
collection = mongo_db.test_collection

所以在此之后根据请求的URL调用所需的视图时,我将数据转储到两个数据库中。像:

mysql_cursor.execute('''INSERT INTO           
table_name(l,n_n,n_id,s_n,s_id,u,r) VALUES
(%s,%s,%s,%s,%s,%s,%s)''',
(l,n_n,n_id,s_name,s_id,u,re)
)   

同样我也是为了保存到MongoDB。

显然这种方法存在这个缺陷,我没有在任何地方关闭连接。但这种方法看起来确实有效。

为什么不使用这种方法?

如何通过使用此方法来衡量我获得的性能改进v / s让Django在每次调用时创建与DB的新连接。

批量插入也可以通过减少对DB的调用来使事情变得更好。如何在视图定义中实现这样的概念?

以下是我的应用程序在使用我尝试建立持久连接的方法之前的行为,并让Django处理它

mysql> show status like '%onn%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| Aborted_connects         | 0      |
| Connections              | 164359 |
| Max_used_connections     | 3      |
| Ssl_client_connects      | 0      |
| Ssl_connect_renegotiates | 0      |
| Ssl_finished_connects    | 0      |
| Threads_connected        | 1      |
+--------------------------+--------+
7 rows in set (0.00 sec)

几秒钟后,当我运行相同的查询时,我得到了:

mysql> show status like '%onn%';
+--------------------------+--------+  
| Variable_name            | Value  |
+--------------------------+--------+
| Aborted_connects         | 0      |
| Connections              | 175047 |
| Max_used_connections     | 3      |
| Ssl_client_connects      | 0      |
| Ssl_connect_renegotiates | 0      |
| Ssl_finished_connects    | 0      |
| Threads_connected        | 1      |
+--------------------------+--------+
7 rows in set (0.00 sec)

http://dev.mysql.com/doc/refman/5.5/en/server-status-variables.html#statvar_Connections表示连接:MySQL服务器的连接尝试次数(成功与否)。因为我处理使用Django ORM for MySQL保存行的某些问题或是这种期望的连接数量?

然而,在使用我的方法后,连接数量没有增加。

解决

通过阅读有关Connections的定义感到困惑。最后通过测试找出了它。 在DB中插入了19条记录,Connections增加了相同的数字。所以我认为这意味着DB已被联系的次数。所以在这种情况下使用Django内置的东西是最好的方法。

http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html表示最大连接数为151,所以无论如何这都是我的错误解释。

1 个答案:

答案 0 :(得分:2)

如果您想进入这样一个技术主题,请查看django.db包并查看Django的数据库后端和QuerySet实例如何在做出任何错误的假设之前相互交互,呃因为Django每次与数据库交互时都会打开一个新的数据库连接。您将看到数据库层执行您在此处提到的所有内容,而不允许开发人员不正确地管理数据库资源,例如在循环中获取游标并忘记关闭它并创建内存泄漏。

所以并不是这种方法不存在,而是由于上面提到的原因,它应该是由你所执行的工作管理和抽象出来的,还有你不需要的额外好处,比方说,直接在视图中合并数据库管理。

话虽如此,对于不受支持的数据库,例如MongoDB和任何其他非关系数据库,您必须假设您没有Django的数据库层来管理您的数据库资源以及您如何与它们进行交互并努力评估什么在与数据库API接口的条件下,您是开发人员的义务。当您看到明显的模式出现时,您将提出一个适合在视图组件环境中应用的解决方案。