在研究Python Web应用程序的一些奇怪问题(特别是有关MongoDB连接的问题)时,我注意到PyMongo官方文档页面上的某些内容。我的Web应用程序使用Flask,但这不应影响我面临的问题。
PyMongo驱动程序会进行连接池化,但是AutoReconnect
当连接陈旧并且需要重新连接时,它也会引发异常()。
它指出(关于自动重新连接例外):
为了自动重新连接,您必须处理此异常,并认识到导致该异常的操作不一定成功。以后的操作将尝试打开与数据库的新连接(并将继续引发此异常,直到建立第一个成功的连接为止)。
我已经注意到,这实际上一直在发生(这似乎不是错误)。似乎静止了几分钟后,MongoDB服务器关闭了连接,需要由Web应用程序重新创建连接。
我不明白的是为什么PyMongo驱动程序在重新连接时会引发错误(驱动程序的用户需要自行处理),而不是透明地执行。(甚至有可能是一个选项,用户可以设置使AutoReconnect
异常不抛出,但将不是一个合理的默认是这些异常没有得到根本抛出,以及连接无缝重现?)
我从未在其他数据库系统上遇到过这种行为,这就是为什么我有点困惑的原因。
还值得一提的是,在连接到本地开发MongoDB服务器时,Web应用程序的MongoDB连接永远不会失败(我认为这与本地连接有关,并且该连接是通过UNIX套接字而不是通过UNIX套接字完成的,这与它有关。网络套接字,但我可能错了。
您误会了自动重新连接。当驱动程序尝试与服务器通信(发送命令或其他操作)并且发生网络故障或类似问题时,将引发此错误。异常的名称旨在表明您不必创建新的MongoClient实例,现有的客户端将在您的应用程序尝试下一个操作时尝试自动重新连接。如果出现相同的问题,则会再次引发“自动重新连接”。
我怀疑您看到套接字超时(并且引发了自动重新连接)的原因是服务器和您的应用程序之间存在负载平衡器,该负载平衡器会在一段时间不活动后关闭连接。例如,在套接字上没有任何活动13分钟之后,这显然发生在Microsoft的Azure平台上。您可能可以使用PyMongo 2.8中添加的socketKeepAlive选项来解决此问题。请注意,您还必须将应用程序服务器上的保持活动间隔设置为适当的值(Linux上的默认值为2小时)。浏览此处获取更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句