背景
经常需要执行脚本调用Java程序读取mongodb中数据,本来是转为后台进程、偶尔看看日志的简单任务。今天发现程序抛出异常“com.mongodb.MongoException$CursorNotFound: cursor 0 not found on server”。一开始没在意,重新执行也可以继续跑,但是过一段时间又抛出同样错误,看来要战斗了。
分析
在mogondb.org官网,我找到了同样的问题,这是一个2013年就发现并解决的问题,官方回应这一BUG,并且已经在版本(2.11.0 release)中解决了。异常原因是游标超时。
例外:或许在涉及oplog的操作中,还是会有问题,请参考:https://jira.mongodb.org/browse/JAVA-771
解决
-
方案1:更新mongodb类库至2.11.0以上。
-
方案2:如果我们不能更新mogondb的类库的话,也可以通过设置超时参数来解决,如下:
cursor.addOption(com.mongodb.Bytes.QUERYOPTION_NOTIMEOUT);
参考
cursor not found on server:https://jira.mongodb.org/browse/JAVA-907
Repeated CursorNotFound exceptions on long-running process following oplog:https://jira.mongodb.org/browse/JAVA-771