2008-11-04 3 views
18

Мне нужно иметь возможность вставлять/обновлять объекты с постоянной скоростью не менее 8000 объектов каждые 5 секунд в базе данных HSQL в памяти.ORM-решения (JPA, Hibernate) и JDBC

Я проверил сравнительное тестирование производительности между 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.

Любые идеи, почему возникло бы такое огромное несоответствие?

+2

Возможно, вы захотите переименовать этот вопрос, так как заголовок не очень описывает весь вопрос. – 2009-03-09 18:57:10

+0

Что бы вы посоветовали? – systemoutprintln 2009-03-09 20:49:22

ответ

15

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

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

+1

Вы тоже делали Hib? В моих тестах партии Hib и партия JDBC были почти идентичны. – 2008-11-04 11:49:00

5

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

+1

Документы могут быть перемещены. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html – JavaRocky 2010-08-06 01:09:25

2

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

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

9

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

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

5

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

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