我目前正在使用Spring的Mongo持久层查询MongoDB。我查询的集合包含大约4G的数据。当我在IDE上运行查找代码时,它会检索数据。但是,当我在服务器上运行相同的代码时,它冻结约15至20分钟,并最终在下面引发错误。我担心的是,它可以在4G Ram Windows PC上运行的IDE上顺利运行,而在14G ram服务器上无法运行。我浏览了Mongo日志,没有发现问题所在。我还假定该问题可能是环境问题,因为它可以在我的本地spring IDE上运行,但是两个本地PC上的库都与服务器上的库相同。有没有人遇到过此类问题,或者有人可以指出我在做什么错。同样奇怪的是,当我恢复到Mongo的Java驱动程序find方法时,find操作有效。

我正在使用mongo-java-driver-2.12.1
spring-data-mongodb-1.7.0.RELEASE

请参阅下面的示例查找操作代码和错误消息。

List<HTObject> empObjects =mongoOperations.find(new Query(Criteria.where("date").gte(dateS).lte(dateE)),HTObject.class);

我得到的异常是:

09:42:01.436 [main] DEBUG o.s.data.mongodb.core.MongoDbUtils - Getting Mongo Database name=[Hansard]
Exception in thread "main" org.springframework.dao.DataAccessResourceFailureException: Cursor 185020098546 not found on server 172.30.128.155:27017; nested exception is com.mongodb.MongoException$CursorNotFound: Cursor 185020098546 not found on server 172.30.128.155:27017
at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:73)
at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2002)
at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1885)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1696)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTempate.java:1679)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:598)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:589)
at com.sa.dbObject.TestDb.main(TestDb.java:74)
Caused by: com.mongodb.MongoException$CursorNotFound: Cursor 185020098546 not found on server 172.30.128.155:27017
at com.mongodb.QueryResultIterator.throwOnQueryFailure(QueryResultIterator.java:218)
at com.mongodb.QueryResultIterator.init(QueryResultIterator.java:198)
at com.mongodb.QueryResultIterator.initFromQueryResponse(QueryResultIterator.java:176)
at com.mongodb.QueryResultIterator.getMore(QueryResultIterator.java:141)
at com.mongodb.QueryResultIterator.hasNext(QueryResultIterator.java:127)
at com.mongodb.DBCursor._hasNext(DBCursor.java:551)
at com.mongodb.DBCursor.hasNext(DBCursor.java:571)
at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1871)
... 5 more

最佳答案

简而言之

MongoDB结果游标在服务器上不再可用。

说明

使用分片并且与mongos的连接故障转移或遇到超时(请参见http://docs.mongodb.org/manual/core/cursors/#closure-of-inactive-cursors)时,可能会发生这种情况。

您正在执行将所有对象加载到一个列表(mongoOperations.find)中的查询。根据结果​​大小,这可能需要很长时间。使用Iterator可以帮助发挥杠杆作用,但是在某些时候甚至限制了使用Iterator加载大量数据的能力。

如果您必须使用分页(分页越慢,分页会变得越慢)或使用范围的分割来查询(您已经有一个日期范围,那么这可以工作)来查询非常大的数据量,则应该对结果进行分区。

关于java - Spring Mongo的查找操作在Windows Server 2008 Machine上卡住,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31113455/

10-11 19:53