Подтвердить что ты не робот

Спящий режим

У меня вопрос, может быть, у кого-то это выглядит глупо. Быстро ли Hibernate? Я использую его в системе, которая будет иметь очень большое количество запросов к базе данных. И производительность становится настороженной. И другой вопрос с точки зрения текущего контекста. Что бы лучше - много простых запросов (с одной таблицей) или немного меньше запросов с несколькими JOIN?

Танки для продвижения Артем

4b9b3361

Ответ 1

С помощью "многих" запросов вы встречаетесь с типичной проблемой запроса N + 1. Вы загружаете Entity с Hibernate, у которого есть связанные объекты. При подключении LAZY вы получите один запрос для каждой записи. Каждый запрос проходит через сеть на ваш сервер базы данных и возвращает данные. Для этого требуется время (открытие соединения, латентность сети, поиск, пропускная способность и т.д.).

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

Один запрос, который занимает 20 мс. vs 100 запросов, которые занимают 1 мс.? Вы делаете математику;)

И если он может вырасти до 1000 записей. Единственный запрос будет иметь небольшое влияние на производительность, но 1000 запросов против 100 в 10 раз больше. Таким образом, с несколькими запросами вы значительно снизили производительность.

При использовании запросов HQL для извлечения данных вы можете добавить FETCH в JOIN, чтобы загрузить данные с тем же запросом ( используя JOIN).

Для получения дополнительной информации, относящейся к этой теме, ознакомьтесь с этим Hibernate Performance Tuning.

Ответ 2

Из нашего опыта Hibernate может быть очень быстрым. Однако может быть много ошибок, характерных для инструментов ORM, включая:

  • Неправильная ленивая загрузка, когда выбрано слишком много или слишком мало данных.
  • N + 1 выберите проблемы, где медленная итерация над коллекциями
  • Следует избегать коллекций List и предпочитаем Set, поэтому информация о заказе не обязательно должна быть включена в таблицу
  • Пакетные действия, в которых лучше всего вернуться на прямой SQL

Страница Улучшение производительности в документах Hibernate - это хорошее место, чтобы начать изучать эти проблемы и другие методы для повышения производительности.

Ответ 3

Да, это может быть быстро. В прошлом у меня появилось несколько случаев, когда люди думают: "Аааа, этот глупый ORM убивает всю производительность нашего приятного приложения" во ВСЕХ случаях после профилирования мы выяснили другие причины проблемы. (реализация плохого хеш-кода для коллекций, regExps из ада, дизайн db, созданный безумным hatter и т.д.)

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

Ответ 4

Спящий режим может быть быстрым. Разработка хорошей схемы, настройка ваших запросов и получение хорошей производительности - это своего рода художественная форма. Помните, что под крышками все это все sql, так что все, что вы можете сделать с sql, вы можете сделать с спящим.

Обычно в расширенном приложении сопоставление/схема hibernate является только начальным этапом написания вашего уровня персистентности. Этот шаг дает вам много функциональности. Но следующий шаг - написать пользовательские запросы с помощью hql, которые позволят вам извлекать только нужные вам данные.

Ответ 5

Это не первый вопрос, но я не смог найти подходящий ответ в своих предыдущих (возможно, это был для другого "форума" ). Итак, я еще раз отвечу: -)

Мне нравится отвечать на это несколько провокационным образом (ничего личного!): вы думаете, что сможете найти решение, которое лучше, чем Hibernate? Это связано не только с основными проблемами, такими как сопоставление столбцов базы данных с свойствами Java и "нетерпеливая или ленивая загрузка" (что является актуальной проблемой вашего вопроса), но также кэширование (1L и 2L), объединение пулов, улучшение байт-кода,...

Тем не менее, Hibernate - сложная часть программного обеспечения, которая требует некоторого обучения правильному использованию и тонкой настройке. Итак, я бы сказал, что лучше потратить свое время на изучение Hibernate, чем написание собственной ORM.

Ответ 6

Спящий режим может быть разумным быстро, если вы знаете, как использовать его таким образом. Тем не менее, polepos.org тесты производительности показывают, что для Hibernate можно замедлять приложения на порядки.

Если вы хотите, чтобы ORM был легким и быстрым, я могу порекомендовать fjorm

Ответ 7

... который имел бы действительно большое количество запросы к базе данных...

Если вы все еще на стадии проектирования/разработки не оптимизируете профилактику.

Hibernate - очень продуманная часть программного обеспечения и остерегайтесь проблем с производительностью. Я бы сказал вам, когда вы проектируете более зрелые, чтобы заниматься проблемами производительности и анализировать для прямого использования JDBC, где это необходимо.

Ответ 8

Он обычно достаточно быстр и может быть быстрее, чем обычное JDBC-решение. Но, как и все инструменты, вы должны использовать его правильно.

Fast ничего не значит. Вы должны определить максимальное время отклика, минимальную пропускную способность и т.д., А затем измерять, удовлетворяет ли решение требованиям и настраивать приложение, чтобы удовлетворить их, если это не так.

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