Python Django持久数据库连接-另一种方法
我在同一个话题上有过类似的帖子和其他东西。 然而,Django并不正式支持到MySQL和Mongo的持久连接(据我所知有限)。因此,我尝试避免了很多东西,并试图使其简单化。因此,我所做的是在我的视图中。py为MongoDB和MySQL创建了全局连接变量,类似于:Python Django持久数据库连接-另一种方法,python,mysql,django,mongodb,mysql-python,Python,Mysql,Django,Mongodb,Mysql Python,我在同一个话题上有过类似的帖子和其他东西。 然而,Django并不正式支持到MySQL和Mongo的持久连接(据我所知有限)。因此,我尝试避免了很多东西,并试图使其简单化。因此,我所做的是在我的视图中。py为MongoDB和MySQL创建了全局连接变量,类似于: from pymongo import Connection import MySQLdb global mongo_connection,mongo_db,collection,mysql_connection,mysql_curso
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)
声明连接:到MySQL服务器的连接尝试次数(成功与否)。这是因为我使用Django ORM for MySQL保存行时遇到了问题,还是预期会出现这种连接次数
然而,在使用我的方法之后,连接的数量并没有增加
已解决
在阅读关于连接的定义时感到困惑,所以最终通过测试找到了答案。
在数据库中插入19条记录,连接数增加了相同的数量。所以我相信这意味着数据库的联系次数。因此,在这种情况下,使用Django的内置内容是最好的方法
告诉我最大连接数是151,所以无论如何这是我的误解。如果你想进入这样一个技术话题,在您做出任何错误的假设之前,请查看
django.db
包,并查看django的数据库后端和QuerySet
实例是如何相互交互的,因为django每次与数据库交互时都会打开一个新的数据库连接。您将看到,数据库层执行您在这里提到的所有操作,而不允许开发人员不正确地管理数据库资源,例如在循环中获取光标,忘记关闭它,并造成内存泄漏
因此,这并不是说该方法不存在,而是因为它是从您执行的工作中管理和抽象出来的,因为它应该是这样的,出于上面提到的原因,它还有一个额外的好处,即您不需要(比如)直接将数据库管理合并到视图中
话虽如此,对于不受支持的数据库,如MongoDB和任何其他非关系数据库,您必须假设没有Django的数据库层来管理您的数据库资源以及如何与它们交互,并认真评估在与它们的数据库API交互的条件下,作为开发人员,您的义务是什么。当你看到明显的模式出现时,你会想出一个适合在视图组件上下文中应用的解决方案。Filip。请再看一次这篇文章,我已经编辑了它,并显示了我让Django处理所有内容时与MySQL的连接数,我们可以讨论针对数据库创建的请求数量问题。我相信在自己编写SQL或依赖ORM之间,您会收到不同数量的请求。不过,希望这能向您证明,您不需要直接与数据库接口,因为后端Django支持。在我到目前为止所做的测试中,当我自己编写SQL时,连接的数量不会增加,而使用ORM时,我保存在DB中的每一次读取都会有新的连接,这相当于每秒200多个连接!!MongoDB有自己的ORM风格,比如在第三行代码之后使用几个全局变量进行MongoEngineStop读取。