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