Django 持久数据库连接 - 一种不同的方法
我看过类似的讨论,比如Django持久数据库连接,还有其他相关的话题。不过,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。
显然,这种方法有个缺陷,就是我没有在任何地方关闭连接。但这种方法似乎有效,而且效果不错。
为什么不使用这种方法呢?
我怎么能衡量使用这种方法和让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处理MySQL保存行时出现了问题,还是说这种连接次数是正常的呢?
不过,使用我的方法后,连接次数并没有增加。
解决了
我在阅读关于连接的定义时感到困惑。最后通过测试搞清楚了。插入19条记录到数据库,连接次数增加了相同的数量。所以我认为这意味着数据库被联系的次数。因此,在这种情况下,使用Django内置的东西是最好的选择。
http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html上说,最大连接数是151,所以这完全是我误解了。
1 个回答
如果你想深入了解这个技术话题,可以看看 django.db
这个包,了解一下 Django 的数据库后端和 QuerySet
实例是怎么相互作用的。在你做出错误假设之前,比如说 Django 每次和数据库互动时都会打开一个新的数据库连接,你可以发现数据库层其实已经处理了你提到的所有事情,避免了开发者在管理数据库资源时出错,比如在循环中获取一个游标却忘了关闭,导致内存泄漏。
所以并不是说这种方法不存在,而是它被管理和抽象化了,这样做是有原因的,正如上面提到的那样,另外一个好处是你不需要在视图中直接处理数据库管理。
不过,对于不被支持的数据库,比如 MongoDB 和其他非关系型数据库,你需要明白 Django 的数据库层并不会管理你的数据库资源,以及你是如何与它们互动的。你需要认真评估作为开发者在与这些数据库 API 接口时的责任。当你发现明显的模式时,你就能找到适合在视图组件中应用的解决方案。