2015-06-29 2 views
0

В настоящее время я использую слой Persistence Mongo Spring для запроса MongoDB. В запросе коллекции I содержится около 4 Гб данных. Когда я запускаю код поиска в своей среде IDE, он извлекает данные. Однако, когда я запускаю тот же код на своем сервере, он зависает примерно на 15-20 минут и, в конце концов, выдает ошибку ниже. Я забочусь о том, что он работает без сучка и задоринки на моей IDE, работающей на моем ПК с 4G Ram Windows, и не работает на моем сервере с сервером 14G. Я просмотрел Mongo Log, и там ничего нет, что указывает на проблему. Я также предположил, что проблема может быть экологической проблемой, поскольку она работает на моей локальной Spring IDE, однако библиотеки на моем локальном компьютере такие же, как на моем сервере. Кто-нибудь имел такую ​​проблему, или кто-нибудь может указать мне на то, что я делаю неправильно. Также странно, операция поиска работает, когда я возвращаюсь к методам поиска java-драйверов Mongo.Функция поиска Spring Mongo зависает на сервере Windows 2008 Машина

Я использую Монго-Java-драйвер - 2.12.1 весна-данных-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 

ответ

0

Короче

MongoDB результат курсора не доступен больше на сервере.

Объяснение

Это может произойти при использовании сегментирования и подключения к mongos сбою или если вы столкнетесь с тайм-аута (см http://docs.mongodb.org/manual/core/cursors/#closure-of-inactive-cursors).

Выполняется запрос, который загружает все объекты в один список (mongoOperations.find). В зависимости от размера результата это может занять много времени. Использование Iterator может помочь в использовании, но даже при загрузке огромных сумм с использованием Iterator s ограничено в определенный момент.

Вы должны разделить результаты, если вам нужно запрашивать очень большие объемы данных, используя либо пейджинг (пейджинг становится медленнее, чем больше пропущенных пропусков), либо путем запроса с разбиением диапазона (у вас уже есть диапазон дат, Работа).

+0

Спасибо за ваш ответ. Вещь - это размер результата на самом деле довольно маленький. Кроме того, тот же запрос отлично работает на моей IDE. Даже при нахождении одного объекта сервер все еще зависает и впоследствии выдает одно и то же исключение. Как я могу управлять курсорами с использованием весеннего монго. – obi

+0

AFAIK, изменяя курсор с использованием Spring Data Mongo, невозможно. Вы пытались получить дамп потока (jstack), чтобы увидеть, где процесс зависает или запускает ваш сервер в режиме отладки и прикрепляет отладчик во время процесса? Тайм-аут курсора пахнет, что что-то происходит в пределах отображения, которое потребляет много времени. – mp911de