为什么我的远程MongoDB连接在每个查询上都需要身份验证?
经过一番折腾,我终于成功在Apache上运行了BottlePY,并且搭建了一个使用MongoDB的网站。我之前主要使用Django,所以在我的问题中会稍微提到Django。
问题
每次通过BottlePY加载页面时,都需要重新验证与MongoHQ.com上MongoDB数据库的连接(这意味着可能需要重新连接)。
我发现的情况
我在每个模型函数的开头加了一个db.keep_alive()
的函数,这样在执行任何MongoDB查询之前,它会尝试先执行一个简单的查询。如果这个查询失败了,它会捕捉到OperationFailure或AutoReconnect的错误,然后调用db.authenticate()
函数进行重新验证。重新验证后,我还让它在日志数据库中记录一下,监控需要重新验证的频率。目前,每次加载页面(需要执行查询)时都需要重新验证,这显然不太对。
与Django的区别
我在Django中也用过这个方法,发现数据库连接在10到15分钟内没有查询后才需要重新验证。
我不明白为什么在Django中创建pymongo连接和在Bottle中创建连接会有不同,因为我使用的是相同的驱动、函数和方法。而且我也没有使用任何ORM之类的东西。
版本信息
- Bottle: 0.9.dev
- Django: 1.2.1 final
- PyMongo: 1.8
感谢大家的帮助!
更新:一个朋友快速看了一下,注意到以下几点,可能对回答我的问题有帮助。
似乎每个请求都在启动一个新的Python进程,而Django则是一个进程会长时间运行。
2 个回答
你的 Apache 配置文件 xxx.conf 里是否包含类似下面的内容:
WSGIDaemonProcess project user=mysite group=www-data processes=5 threads=1
WSGIProcessGroup project
我觉得最重要的应该是 threads=1
这件事就是在Bottle和MongoHQ之间出现了一个奇怪的问题。虽然没有找到真正的解决办法,但我用其他框架试了试,没能重现这个问题。如果你有其他想法,欢迎分享。