Решения ORM (JPA; Hibernate) против JDBC

Мне нужно иметь возможность вставлять / обновлять объекты с постоянной скоростью не менее 8000 объектов каждые 5 секунд в базе данных HSQL в памяти.

Я провел сравнительное тестирование производительности между Spring / Hibernate / JPA и чистым JDBC. Я обнаружил значительную разницу в производительности при использовании HSQL. С помощью Spring / Hib / JPA я могу вставить 3000-4000 своих объектов размером 1,5 КБ (с отношениями «один-многие» и «многие-многие») за 5 секунд, а с прямым Вызовы JDBC. Я могу вставить 10 000–12 000 таких же объектов.

Я не могу понять, почему возникает такое огромное несоответствие. Я сильно изменил настройки Spring / Hib / JPA, безуспешно пытаясь приблизиться к производительности. Я хочу использовать Spring / Hib / JPA для будущих целей, расширяемости и потому, что отношения внешнего ключа (один-многие и многие-многие) трудно поддерживать вручную; но требования к производительности, похоже, указывают на использование чистого JDBC.

Есть идеи, почему может быть такое огромное несоответствие?

Возможно, вы захотите переименовать этот вопрос, так как заголовок не очень описывает фактический вопрос.

James McMahon 09.03.2009 21:57
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
18
1
18 791
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Документы могли быть перемещены. docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.ht‌ ml

JavaRocky 06.08.2010 05:09
Ответ принят как подходящий

У нас есть аналогичный опыт сравнения Hibernate с JDBC в пакетном режиме (оператор # executeBatch ()). По сути, кажется, что Hibernate не очень хорошо справляется с массовыми операциями. В нашем случае реализация Hibernate была достаточно быстрой на нашем производственном оборудовании.

Возможно, вы захотите обернуть вызовы базы данных в DAO, предоставив вашему приложению последовательный способ доступа к вашим данным. Реализуйте свои DAO с помощью Hibernate, где это удобно, и с помощью JDBC, где этого требуют требования к производительности.

Вы тоже принимали Hib-терапию? В моих тестах партии Hib и JDBC были почти идентичны.

Vladimir Dyuzhev 04.11.2008 14:49

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

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

Как минимум, вам нужно выполнять пакетную вставку в Hibernate: http://www.hibernate.org/hib_docs/reference/en/html/batch.html Экономит много времени на обход.

И, как сказал Джастис, основная цель Hib - не производительность компьютера, а производительность разработчика. Сказав это, обычно можно достичь сопоставимых (не равных, но не намного хуже) результатов JDBC.

Возможно, документы переместились. Попробуйте здесь docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.ht‌ ml

JavaRocky 06.08.2010 05:08

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

Pace 18.06.2013 01:27

Никогда не используйте одну технологию для всех проблем. В зависимости от проблемы решите, какую технологию использовать. Конечно, jpa или hibernate медленнее, чем jdbc. jdbc находится на более низком уровне, чем jpa. Также профессионал по базам данных с jdbc может написать более оптимизированный sql, чем jpa. Если вы указали критическую точку, где требуется скорость, jpa не ваш выбор.

Другие вопросы по теме