【发布时间】: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 循环