Быстрый способ получить результаты в спящем режиме? - PullRequest
4 голосов
/ 19 февраля 2011

В настоящее время в моем проекте настроен режим гибернации. Это хорошо работает для большинства вещей. Однако сегодня мне нужно было запрос вернуть пару сотен тысяч строк из таблицы. Это было ~ 2/3 от общего числа строк в таблице. Проблема в том, что запрос занимает ~ 7 минут. Используя прямой JDBC и выполняя то, что я предполагал, было идентичным запросом, это занимает <20 секунд. Из-за этого я предполагаю, что я делаю что-то совершенно не так. Я перечислю код ниже. </p>

DetachedCriteria criteria  =DetachedCriteria.forlass(MyObject.class);
criteria.add(Restrictions.eq("booleanFlag", false));
List<MyObject> list = getHibernateTemplate().findByCriteria(criteria);

Любые идеи о том, почему это будет медленно и / или что я мог бы сделать, чтобы изменить его?

Ответы [ 3 ]

5 голосов
/ 19 февраля 2011

Возможно, вы уже ответили на свой вопрос, используйте прямой JDBC.

Hibernate создает в лучшем случае экземпляр некоторого Object для каждой строки или, что еще хуже, кратного Object экземпляры для каждой строки.Hibernate имеет действительно вырожденное поведение генерации и создания экземпляров кода, которое может быть трудно контролировать, особенно с большими наборами данных, и даже хуже, если у вас включена какая-либо из опций кэширования.и обработка сотен тысяч строк как объектов также не очень ориентирована на производительность.

Необработанный JDBC - это просто необработанные типы для столбцов строк.Порядки меньших данных.

5 голосов
/ 19 февраля 2011

Я не уверен, что hibernate - это то, что вам нужно, если вам нужно извлечь сотни тысяч записей Время выполнения запроса может быть меньше 20 секунд, но время выборки будет огромным и займет много памяти. После того, как вы получите все эти записи, как вы их выводите? Это гораздо больше данных, чем вы могли бы показать пользователю. Hibernate не очень хорошее решение для обработки данных в стиле хранилища данных.

1 голос
/ 19 февраля 2011

Возможно, у вас есть несколько ссылок на другие классы в вашем классе MyObject, и в вашем отображении вы устанавливаете готовую загрузку или что-то в этом роде.Очень трудно найти проблему с помощью написанного вами кода, потому что все в порядке.
Возможно, вам будет лучше использовать Hibernate Profiler - http://hibernateprofiler.com/.Он покажет вам все проблемы с вашими отображениями, конфигурациями и запросами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...