为什么PyMongo会抛出AutoReconnect?

时间:2015-03-02 11:54:04

标签: python mongodb pymongo

在研究我的Python Web应用程序的一些奇怪问题时(特别是有关MongoDB连接的问题),我注意到了一些on the official PyMongo documentation page。我的网络应用程序使用Flask,但这不应该影响我面临的问题。

PyMongo驱动程序执行连接池,但是当连接失效并且重新连接到期时,它也会抛出异常(AutoReconnect)。

它声明(关于AutoReconnect异常):

  

为了自动重新连接,您必须处理此异常,并进行识别   导致它的操作未必成功。   未来的操作将尝试打开一个新的连接   数据库(并将继续将此异常提升到第一个   成功连接)。

我注意到这实际上经常发生(并且它似乎不是一个错误)。在看似几分钟不活动之后,MongoDB服务器关闭了连接,并且需要由Web应用程序重新创建。

我不明白为什么PyMongo驱动程序在重新连接时(驱动程序的用户需要自己处理)而不是透明地执行错误时会抛出错误。 (甚至可能有一个用户可以设置的选项,以便AutoReconnect例外被抛出,但不明智的默认是这些例外不会被抛出所有,连接是无缝重建的?)

我从来没有遇到过使用其他数据库系统的这种行为,这就是为什么我有点困惑。

还值得一提的是,当连接到我的本地开发MongoDB服务器时,我的Web应用程序的MongoDB连接永远不会失败(我认为这与它本地的事实有关)连接,并且连接是通过UNIX套接字而不是网络套接字完成的,但我可能是错的。)

1 个答案:

答案 0 :(得分:11)

你误解了AutoReconnect。当驱动程序尝试与服务器通信(发送命令或其他操作)并发生网络故障或类似问题时,会引发此问题。异常的名称是为了表示您必须创建MongoClient的新实例,现有客户端将在您的应用程序尝试下一个操作时尝试自动重新连接。如果出现同样的问题,则再次引发AutoReconnect。

我怀疑你看到套接字超时(并引发AutoReconnect)的原因是服务器和你的应用程序之间有一个负载平衡器,在一段时间不活动后关闭连接。例如,这显然发生在Microsoft的Azure平台上,在套接字上没有活动13分钟后。您可以通过使用PyMongo 2.8中添加的socketKeepAlive选项来解决此问题。请注意,您还必须将应用程序服务器上的keepalive间隔设置为适当的值(Linux上的默认值为2小时)。 See here for more information.