在AutoReconnect异常后,我可以继续使用pymongo游标对象吗?

时间:2015-05-07 07:04:01

标签: mongodb cursor pymongo

当您从数据库查询中收到AutoReconnect异常时,通常的做法是稍等一下,然后再次尝试查询(在某些情况下可能是无限的)。

如果在遍历游标时发生这种情况,继续尝试从同一个游标对象获取数据是否有意义,或者我是否必须创建一个新的并从头开始? pymongo游标对象是否能够优雅地处理这种情况而不会丢失数据?

让我们假设问题是某种临时网络中断,并且服务器很好(因此应该仍然知道光标)。

1 个答案:

答案 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?

因此,从一开始就启动请求是合理的。