背景
經常需要執行腳本調用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