【问题标题】:Python and mongoDB connection pool ( pymongo )Python 和 mongoDB 连接池 (pymongo)
【发布时间】:2012-11-25 17:08:13
【问题描述】:

我有一个 Web 应用程序,每分钟有数千个请求。 以下是我用于 mongoDB 连接的 python 代码:

工具.py:

globalconnection = None

def getCollection(name,safe=False,readpref=ReadPreference.PRIMARY):

    global globalconnection
    while globalconnection is None:
            try:
                    if not globalconnection is None:
                            globalconnection.close()
                    globalconnection = Connection('mongodb://host:port',replicaSet='mysetname',safe=False,read_preference=ReadPreference.PRIMARY,network_timeout=30,max_pool_size=1024)
            except Exception as e:
                    globalconnection = None

    request_context.connection = globalconnection

    return request_context.connection["mydb"]["mycoll"]

web.py

@app.route("/test")
def test():
    request_collection = getCollection("user")
    results = request_collection.find()
    for result in results:
        #do something...
        request_collection.save(result)
    request_collection.end_request()

一个http请求通过这个函数获取连接,

并且http请求在请求结束前调用end_request。

但是我发现在增加请求的同时,mongoDB中有很多AutoReconnect错误和超过20000个连接。

你有什么建议吗?

【问题讨论】:

  • 这无关,但更常见的说法是if x is not None:
  • 更不用说那条线上的 globalconnection 不可能不是 None,因为我们刚刚过去了“while globalconnection is None:”
  • 因为会有多个请求同时进入"while",所以我加上"if"来减少Connection对象的数量
  • 正如 Asya 所说,当 globalconnection 为 None 时,while 循环将停止,这意味着在 while 循环内 globalconnection 将始终为 false。不是 do-while 循环

标签: python mongodb pymongo


【解决方案1】:
  1. 对于自动重新连接,您只需捕获异常,然后尝试再次获取连接: http://api.mongodb.org/python/current/api/pymongo/errors.html

  2. 30 秒超时听起来太长了,试试更短的超时?

  3. 增加 mongodb 的最大连接数(默认:20000) http://www.mongodb.org/display/DOCS/Connections

【讨论】:

  • 1.谢谢你的建议,我已经实施了。 2.你有什么建议吗? 3. 我对此一无所知,因为根据这个website,mongoDB 中有 20,000 个连接的限制
猜你喜欢
  • 2012-06-13
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多