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

2 投票
1 回答
3617 浏览
提问于 2025-04-17 08:21

我看过类似的讨论,比如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 个回答

2

如果你想深入了解这个技术话题,可以看看 django.db 这个包,了解一下 Django 的数据库后端和 QuerySet 实例是怎么相互作用的。在你做出错误假设之前,比如说 Django 每次和数据库互动时都会打开一个新的数据库连接,你可以发现数据库层其实已经处理了你提到的所有事情,避免了开发者在管理数据库资源时出错,比如在循环中获取一个游标却忘了关闭,导致内存泄漏。

所以并不是说这种方法不存在,而是它被管理和抽象化了,这样做是有原因的,正如上面提到的那样,另外一个好处是你不需要在视图中直接处理数据库管理。

不过,对于不被支持的数据库,比如 MongoDB 和其他非关系型数据库,你需要明白 Django 的数据库层并不会管理你的数据库资源,以及你是如何与它们互动的。你需要认真评估作为开发者在与这些数据库 API 接口时的责任。当你发现明显的模式时,你就能找到适合在视图组件中应用的解决方案。

撰写回答