【问题标题】:Django Persistent DB connections - A different approachDjango Persistent DB 连接 - 一种不同的方法
【发布时间】:2012-01-20 03:05:59
【问题描述】:

我已经讨论过类似的主题,例如 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 所做的。

显然这种方法存在一个缺陷,即我没有在任何地方关闭连接。但是这种方法似乎确实有效并且运作良好。

为什么不使用这种方法?

我如何衡量我通过使用这种方法获得的性能改进与让 Django 在每次调用时创建与数据库的新连接。

另外,批量插入应该通过减少对 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 声明 Connection:The number of connection attempts (success or not) to the MySQL server.So it is due to some problem where I handle save a row using Django ORM for MySQL or is this sort number预期的连接数?

但是使用我的方法后,连接数并没有增加。

已解决

阅读关于连接的定义感到困惑。所以最后通过测试弄明白了。 在数据库中插入了 19 条记录,连接数增加了相同的数量。所以我相信这意味着数据库被联系的次数。所以在这种情况下,使用 Django 的内置东西是最好的方法。

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

【问题讨论】:

  • 在带有多个全局变量的第三行代码后停止阅读。

标签: python mysql django mongodb mysql-python


【解决方案1】:

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

因此,并不是说该方法不存在,而是它是从您执行的工作中管理和抽象出来的,出于上述原因,它应该是这样的,并且您不需要这样做,例如,直接将数据库管理合并到一个视图中。

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

【讨论】:

  • Filip.请再看一遍帖子,我已经编辑了它并显示了当我让 Django 处理所有东西时与 MySQL 建立的连接数
  • 好吧,我们可以讨论创建对数据库的请求数的问题。我敢肯定,在自己编写 SQL 或依赖 ORM 之间,您会收到不同数量的请求。不过,希望这确实向您证明,对于 Django 支持的后端,您不需要直接与数据库交互。
  • 在我到目前为止所做的测试中,当我自己编写 SQL 时,使用 ORM 时连接数没有增加,我保存在 DB 中的每个读数,我都有新的连接,总计 200奇怪的连接秒!
  • MongoDB 有自己的 ORM 风格,比如 MongoEngine
猜你喜欢
  • 2015-06-06
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2017-12-26
相关资源
最近更新 更多