Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django持久数据库连接-另一种方法_Python_Mysql_Django_Mongodb_Mysql Python - Fatal编程技术网

Python Django持久数据库连接-另一种方法

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

我在同一个话题上有过类似的帖子和其他东西。 然而,Django并不正式支持到MySQL和Mongo的持久连接(据我所知有限)。因此,我尝试避免了很多东西,并试图使其简单化。因此,我所做的是在我的视图中。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)
声明连接:到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读取。