查詢mongoDB集合數據更新,數據有400w多。我一次用cursor(游標)取1w,處理更新。程序在某段時間運行中遍歷游標時發生異常!
DBCursor cursor = tabColl.find(queryObj).skip(startRow).limit(pageSize);
完整異常信息:
com.mongodb.MongoException$CursorNotFound: cursor not found on server
at com.mongodb.DBApiLayer$Result.init(DBApiLayer.java:379)
at com.mongodb.DBApiLayer$Result._advance(DBApiLayer.java:426)
at com.mongodb.DBApiLayer$Result.hasNext(DBApiLayer.java:408)
at com.mongodb.DBCursor._hasNext(DBCursor.java:495)
at com.mongodb.DBCursor.hasNext(DBCursor.java:515)
at com.bsdwwd.boss.util.deal.UpdateTUserMongoByInfo.deal(UpdateTUserMongoByInfo.java:106)
at com.bsdwwd.boss.util.deal.UpdateTUserMongoByInfo.detailDeal(UpdateTUserMongoByInfo.java:53)
at com.bsdwwd.boss.util.process.AbstractProcess.run(AbstractProcess.java:181)
at java.lang.Thread.run(Thread.java:662)
原因是取到的cursor對象默認是有時間限制的,時間過后cursor就沒有了(我猜想應該被mongoDB后台程序回收了)
解決方法:
在獲取到cursor對象后設置下
cursor.addOption(Bytes.QUERYOPTION_NOTIMEOUT);//默認游標打開有時間限制,設置成無時間限制
注意:
cursor使用完畢后,一定要關閉(游標最后都是這樣,規范操作)。搞不定會出現什么詭異的錯誤!