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

Spring JDBCTemplate VS Hibernate с точки зрения производительности

В нашем проекте мы должны решить между Spring JDBCTemplate и Hibernate.

Я хочу знать, что лучше с точки зрения скорости и реализации и дизайна. и как?

4b9b3361

Ответ 1

Если вы сделаете все возможное, чтобы сделать обе реализации очень быстрыми, шаблон JDBC, вероятно, будет немного быстрее, потому что у него нет служебных данных, которые Hibernate имеет. Но для реализации, вероятно, потребуется гораздо больше времени и строк кода.

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

Я бы сказал, что в 95% случаев Hibernate достаточно быстр или даже быстрее, чем не оптимизированный код JDBC. Для оставшихся 5% ничего не запрещает вам использовать что-то другое, например, Spring -JDBC. Оба решения не являются взаимоисключающими.

Ответ 2

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

Также обратите внимание, что внутренности Hibernate будут протекать в вашу модель и DAO. Известные пункты конфликта обычно equals()/hashCode() и ленивая загрузка коллекций за пределами транзакций. Поскольку примеры с Hibernate настолько просты, и вы можете добиться многого за короткое время, это может привести к ошибочному представлению о том, что Hibernate прост. Не это. Hibernate делает много предположений и заставляет вас думать и кодировать определенным образом.

Использование JdbcTemplate проще, потому что это очень тонкая оболочка вокруг самого JDBC. Цена здесь заключается в том, что вы будете писать тысячи строк действительно скучного кода. Кроме того, вы обнаружите, что строки SQL действительно трудно поддерживать. Когда ваша модель данных изменится, вам придется искать всю базу кода для всех мест, которые могут быть затронуты. Это будет не так.

Для нашего собственного проекта мы решили против Hibernate, потому что у нас действительно сложные структуры данных (пересмотренные древовидные структуры), и нам приходится создавать сложные поисковые запросы во время выполнения. Вместо этого мы написали наш собственный слой DAO, используя jOOQ. jOOQ - это тонкая оболочка вокруг JDBC, которая позволяет вам писать SQL с хорошим DSL в Java:

create.selectFrom(BOOK)
      .where(PUBLISHED_IN.equal(2011))
      .orderBy(TITLE)

Подобно Hibernate, у jOOQ есть некоторые правила, которым вы должны следовать, или вы не будете счастливы, но они гораздо более снисходительны.

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

Одна из ключевых особенностей заключается в том, что реализация DAO выглядит так:

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

Теперь вы можете задаться вопросом, где реализация, так как это просто интерфейс с определением метода, но это. Во время выполнения Spring Data создаст код для вас, который реализует этот метод. Это возможно, потому что 99% всех запросов, которые вам понадобятся, имеют форму "таблица запросов для всех строк, где столбец X...", поэтому они оптимизировали этот прецедент.

OTOH, если вы уже знаете, что вы собираетесь создавать действительно сложные поисковые запросы во время выполнения, Spring Данные, вероятно, не будут иметь большой поддержки.

Ответ 3

В нашем проекте мы используем как JdbcTemplate, так и Hibernate. Что вам нужно сделать, это поделиться DataSource между Hibernate и JdbcTemplate. Мы можем проверить производительность как по операциям, в зависимости от того, что лучше, мы лучше используем. В основном мы используем спящий режим для обычных операций, если есть большие запросы или тяжелые операции, мы проверяем производительность для jdbc и hibernate в зависимости от того, что лучше мы используем.

Хорошая точка HibernateTransactionManager работает как для (JdbcTemplate, plain jdbc), так и для спящего режима.