2012-11-22 158 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) –