2015-03-31 3 views
1

После обновления SpringData MongoDB от 1.6.1 до 1.7.0 У меня возникают проблемы с производительностью.SpringData MongoDB ошибка производительности/выпуск после обновления

Особенно это плохо запрос:

@Query(value = "{$and: [{?0 : { $exists: true }}, {'lastChanged': {$gt: ?1}}] }") 
List<Event> findAllByPrefixedInvitedUserAndLastChangedLessThan(String prefixedUserID, LocalDateTime lastChanged); 

где prefixedUserID запрашивает встроенный документ (доступ по строке "invitedUser.userID", которая, кстати, вещь, которую я не мог решить, используя синтаксис стандартного запроса ни с пользовательским запросом)

Фактическая проблема заключается в том, что этот запрос занимает около 8-10 секунд с базой данных, содержащей 4 (!!!) события.

Для исследования на эту плохую работу, я уменьшил уровень журнала для пружинных данных для отладки и получил файл журнала ~ 20,0000 линии для вызова одной функции (getAllEventsForUser функции из класса de.steilerdev.myVerein.server.controller.user.EventController называется -> можно найти в мой repo). Я положил журнал в this gist.

Как вы можете видеть, MongoDbUtils [doGetDB] - Getting Mongo Database name=[myVerein] называется тысячи раз. Я не могу действительно отладить эту проблему, поэтому я надеюсь, что любой из разработчиков проекта изучит это.

Другая возможность - проблема конфигурации, но я не мог найти никакого уведомления в редакторе изменений, в котором говорилось, что я должен был изменить какую-либо конкретную запись при обновлении. Тем не менее, вы можете найти всю базу данных и пружинную конфигурацию, связанные в этой папке моего репо (ссылка выше):

/src/main/webapp/WEB-INF/configuration/ 

(К сожалению, у меня нет достаточной репутации размещать более двух ссылок)

I надеюсь, есть кто-то, кто может помочь мне в решении этой проблемы. Заранее спасибо!

PS: неоднократно вызов функции doGetDB происходит на все мои запросы, но реже («только» несколько сот раз)

PPS: Я бег MongoDB версия 3.0.1

+0

Любая возможность добавить тестовый пример, который воспроизводит выход журнала? Вызов метода репозитория или тому подобное? –

+0

Я не уверен, что вы ищете, но да, вызов этой функции репозитория вызывает большую часть этого вывода. Полный журнал был создан функцией, упомянутой выше, которая может быть найдена в связанном репозитории github. Это функция 'getAllEventsForUser' из класса [de.steilerdev.myVerein.server.controller.user.EventController] [1]. Надеюсь, это то, что вы ищете. [1]: https://github.com/steilerDev/myVerein/blob/master/Code/Server/src/main/java/de/steilerdev/myVerein/server/controller/user/EventController.java –

+0

Я ищу некоторый код, который я могу выполнить, чтобы воспроизвести вывод журнала, который вы видите. Обычно это тест. –

ответ

0

Что я подозреваю здесь в том, что проблема invitedDivision в Event является причиной проблем. DBRefs загружаются с нетерпением по умолчанию, что означает, что вы увидите поиск для каждого документа в коллекции.

Здесь вы можете попытаться настроить атрибут lazy аннотации здесь, чтобы избежать ожидающих поисков. Также можно было бы переключиться на обращение к идентификаторам и вручную разрешить Divisions через их репозиторий.

Что вы видите, что изменения, произошедшие с обновлением до 1.7, очень вероятно связаны с изменениями, внесенными нами для обеспечения совместимости с драйвером MongoDB 3.0. Я зарегистрировал DATAMONGO-1193, чтобы исправить это. Я также делаю файл DATAMONGO-1194, чтобы исправить эту проблему для использования с драйвером MongoDB 3.0, поскольку он также поразит пользователей обновлением нового драйвера. При этом обходные пути, описанные выше, должны работать в любом случае.

+0

Ничего себе, что сделал! Просто следующий вопрос: почему ленивый не включен по умолчанию? Есть ли серьезная проблема с производительностью при использовании ленивых повсюду, или есть ли проблемы при этом? –

Смежные вопросы