2012-11-22 439 views
2

我有一个web应用程序,每分钟有数千个请求。 下面是我的MongoDB的连接Python代码:Python和mongoDB连接池(pymongo)

Tool.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个连接。

你有什么建议吗?

+3

这是不相关的,但它是更常见的是说'如果x不是无:'。 –

+0

更不用说,因为我们刚刚到达那里,全局连接不可能不是None,而“globalconnection为None:” –

+0

因为在同一时间内会有多个请求进入“while”,所以我添加了“if”以减少连接对象的数量 –

回答

2
  1. 对于自动重新连接您只需捕获异常,并尝试再次获取连接: http://api.mongodb.org/python/current/api/pymongo/errors.html

  2. 30秒超时听起来太长,尽量缩短超时呢?从MongoDB的连接

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

+0

1.感谢您的建议,并且我已经实施了它。 2.你有什么建议吗? 3.我不知道这个,因为mongoDB在这个[网站]上有20,000个连接的限制(http://www.mongodb.org/display/DOCS/Too+Many+Open+Files) –