Hibernate OGM — MongoDB: как получить данные в режиме только для чтения для повышения производительности

У меня есть приложение Java, использующее структуру Hibernate OGM и базу данных Mongo. Когда я получаю много данных, приложение становится очень медленным, и одним из узких мест является Hibernate.

Я читал, что извлечение данных в контексте только для чтения значительно повышает производительность. Как я могу это сделать?

Я пробовал с вызовами методов следующим образом:

entityManager.lock(entity, LockModeType.READ);

or:

entityManager.createNativeQuery(query, entity)
.setLockMode(LockModeType.READ)
.getResultList();

но кажется там не поддерживаются.

Я не могу ждать 20 минут для нескольких мегабайт. Пожалуйста помоги! Каждое предложение приветствуется

В моем случае у меня есть дерево от одного ко многим ассоциациям. Запрос находится в корне, где для выборки задано значение LAZY. Затем я вызываю в потоке метод Hibernate.initialize(proxy) на втором уровне, где восстановление EAGER, на более глубокий уровень.


person Daniele Cuomo    schedule 09.08.2017    source источник
comment
Может быть, вы можете описать свой вариант использования более подробно?   -  person Davide    schedule 10.08.2017


Ответы (1)


В диспетчере сущностей вы можете использовать подсказки запросов:

em.createNativeQuery( query )
  .setHint( "org.hibernate.readOnly", true )
  .getResultList();

или вы можете использовать сеанс:

em.unwrap( OgmSession.class )
  .createNativeQuery( query )
  .setReadOnly( true )
  .list();

Обратите внимание: если вы можете добавить более подробную информацию о характере проблем и если это проблема в Hibernate OGM, мы можем создать для нее исправление.

person Davide    schedule 10.08.2017
comment
Большое спасибо. Я пробовал оба способа, но время ожидания все еще долгое. Может я зря так делаю? Я сделал запрос к самой высокой таблице в цепочке ассоциаций. - person Daniele Cuomo; 10.08.2017
comment
Если вы можете создать тест для нас, мы можем помочь вам больше. Однако ваш вопрос касался включения режима только для чтения, поэтому я думаю, что ответ правильный. Если ваш вопрос слишком общий для stackoverflow, вы можете использовать форум hibernate: forum.hibernate. org/viewforum.php?f=31 - person Davide; 11.08.2017