适当的范围来实例化Pymongo中的Connection()对象

时间:2012-08-25 14:41:12

标签: python mongodb flask pymongo

我正在运行一个使用Mongodb的基于Flask的Web应用程序(Pymongo用于Python)。几乎每个视图都访问数据库,所以我想最有效地利用内存和CPU资源。我不确定用于实例化pymongo的Connection()对象的最有效方法是什么,该对象用于访问和操作数据库。现在,我在文件顶部声明from pymongo import Connection,然后在每个视图函数的开头声明:

def sampleViewFunction():
    myCollection = Connection()['myDB']['myCollection']
    ## then use myCollection to manipulation the database
    ## more code...

我可以做的另一种方式是在我的文件顶部声明:

from pymongo import Connection
myCollection = Connection()['myD']['myCollection']

然后,您的代码只会读取:

def sampleViewFunction():
    ## no declaration of myCollection since it's a global variable
    ## then use myCollection to manipulation the database
    ## more code...

所以唯一的区别是myCollection的声明范围。这两种方法在处理内存和CPU消耗方面有何不同?由于这是一个Web应用程序,我正在考虑多个用户同时是该站点的场景。我想与数据库连接的生命周期存在差异,我猜这可能会影响性能。

1 个答案:

答案 0 :(得分:3)

您应该使用第二种方法。在pymongo中创建连接时,默认情况下会创建连接池。有关详细信息,请参阅文档,请参阅here。这是正确的做事方式。默认的max_pool_size是10,因此这将为您提供10个与mongod实例的连接。如果你以另一种方式完成它并为每个函数调用创建一个池,你将

  1. 创建并销毁每个函数调用的连接,这会浪费资源 - RAM和CPU。
  2. 无法控制您的代码将为mongod创建的连接数量 - 您可以通过连接充斥mongod