java - Spring Mongo的查找操作在windows server 2008机器上卡住

标签 java spring mongodb

我目前正在使用 Spring 的 Mongo 持久层来查询 MongoDB。我查询的集合包含大约4G的数据。当我在 IDE 上运行查找代码时,它会检索数据。但是,当我在服务器上运行相同的代码时,它会卡住大约 15 到 20 分钟,并最终抛出以下错误。我担心的是,它在我的 4G RAM Windows PC 上运行的 IDE 上运行顺利,但在我的 14G RAM 服务器上失败。我查看了 Mongo 日志,没有任何内容指出问题所在。我还认为问题可能是环境问题,因为它可以在我本地的 spring IDE 上运行,但是我本地电脑上的库与我服务器上的库相同。有没有人遇到过此类问题,或者有人可以指出我做错了什么。同样奇怪的是,当我恢复到 Mongo 的 java 驱动程序查找方法时,查找操作起作用了。

我正在使用 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);

我得到的异常(exception)是:

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机器上卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31113455/

相关文章:

java - 无法解析Toast方法(Android Studio)

java - api中如何定义接口(interface)才合理?抛出异常或者返回ErrorCodeBean结果?

java - hibernate : Using AND combined with OR in a single query

java - 如何向ajax请求添加请求参数,以获取从jSON初始化并由Spring映射的jQuery数据表

java - 如何编写从外部存储器删除文件的代码

java - JSP 上的预定文本

java - 在 JpaRepository (Spring Data) 中缓存方法

mongodb - 在这种情况下,如何将mongoDB的地理位置数据转换为Elasticsearch 7.x?

mongodb - 在mongodb中调用ensureindex的优势仅仅是速度吗?

node.js - MongoDb mapreduce 到另一个集合的内存效率比 `out inline` 更高