在研究我的Python Web应用程序中的一些奇怪问题(特别是关于MongoDB连接性的问题)时,我注意到了一些on the official PyMongo documentation page。我的web应用程序使用Flask,但这不应该影响我面临的问题。为什么PyMongo会抛出AutoReconnect?
PyMongo驱动程序执行连接池,但是当连接失效并且需要重新连接时,它也会引发异常(AutoReconnect
)。
它指出,(有关autoReconnect的除外):
为了自动重新连接,您必须处理这个异常,认识 对于造成它的操作不一定成功。 未来的操作将尝试打开到 数据库的新连接(并且将继续引发此异常,直到完成第一个成功连接 )。
我注意到,这实际上是不断发生的(并且它似乎不是一个错误)。在几分钟不活动之后,连接被MongoDB服务器关闭,并且需要由Web应用程序重新创建。
我不明白为什么PyMongo驱动程序在重新连接时(驱动程序的用户需要自己处理)抛出一个错误,而不是透明地进行。 (甚至可以有一个选项,用户可以设置,以便例外做被抛出,但不会明智的默认是这些例外不会被抛出,并且连接被无缝重新创建?)
我从来没有遇到过使用其他数据库系统的这种行为,这就是为什么我有点困惑。
还值得一提的是,当连接到我的本地开发MongoDB服务器时,我的Web应用程序的MongoDB连接永远不会失败(我认为这与它本地连接有关,而且连接是通过UNIX套接字而不是网络套接字,但我可能是错的)。
Python驱动程序开发人员在JIRA问题中对Autoreconnect进行了几次讨论。看看[PYTHON-197](https://jira.mongodb.org/browse/PYTHON-197),对于初学者来说。如果您阅读了JIRA中有关Autoreconnect的内容并且不满意,我会打开一张PYTHON票证。 – wdberkeley 2015-03-02 15:40:25
感谢您指出这一点!这感觉就好像非我这样的非强大用户,不操作整个复制的mongo群集已经被排除在外。你有什么想法为什么这些连接实际超时?如果套接字关闭,它们不应该立即失败吗? – 2015-03-02 16:08:48
对于没有更多信息的情况下连接失败的原因,我无话可说。 mongod日志中是否有关于连接关闭的任何内容? – wdberkeley 2015-03-02 16:13:52