当您从数据库查询中收到AutoReconnect异常时,通常的做法是稍等一下,然后再次尝试查询(在某些情况下可能是无限的)。
如果在遍历游标时发生这种情况,继续尝试从同一个游标对象获取数据是否有意义,或者我是否必须创建一个新的并从头开始? pymongo游标对象是否能够优雅地处理这种情况而不会丢失数据?
让我们假设问题是某种临时网络中断,并且服务器很好(因此应该仍然知道光标)。
答案 0 :(得分:1)
光标存储在MongoDB服务器上,所有操作也在服务器上执行(例如排序,限制等)。此外,服务器以数据块的形式将数据传输到客户端(有关详细信息,请参阅documentation)。
想象一下以下场景:
Client Server
------ ------
| |
| |
make query =======================>
| |
| process query
| |
| construct cursor
| | +--------+
| store cursor ----------> | Cursor |
| | +--------+
<===================== return cursor/chunk
| |
iterate half chunk |
| SERVER GOES DOWN
| -----------------------------------------------------------
| : X
iterate till the end : ^
| SERVER COMES LIVE |
| | |
request the next chunk ==================> ---------------------+ The cursor no longer exists
| |
<============================= |
| server responds with a |
| pretty much intelligent |
| error |
如果您在Mongo Shell上运行此方案,您将获得一个不错的Error: getMore: cursor didn't exist on server, possible restart or timeout?
。
因此,从一开始就启动请求是合理的。