Лучший способ обработки сеансов Hibernate в многоуровневом веб-приложении Spring

Если у нас есть веб-приложение с

  • тяжелый интерфейс (Spring MVC + JQuery с JSON)
  • Hibernate с JPA-аннотациями, являющимися моделью домена
  • expand Spring -provided DAO для кодирования слоя DAO
  • JBOSS - сервер приложений с Oracle как бэкэнд
  • Пул соединений на основе источника данных (JNDI) (не XA, а локальный источник данных)
  • также имеет доступ к нескольким источникам данных (с несколькими БД).

Поведенчески большая часть поиска данных (70%) и обновление данных составляют 30%
Каковы были бы лучшие методы для следующего, чтобы эффективно потреблять связи БД, а также видеть, что при подключении нет большой утечки?

  • было бы лучше выбрать DAO на основе Hibernate?
  • Какой диспетчер транзакций будет предлагать, и мы должны пойти на управление транзакциями на основе AOPWhere
  • где необходимо создать сеанс и где закрыть сеансы для эффективного использования соединений из пула соединений.
  • Верно, что нам нужно обрабатывать транзакции с уровня Service, но что происходит с сеансами, они будут ждать более длительного времени (мы не используем какой-либо openessioninviewFilter)
  • в каком слое лучше обрабатывать проверенные исключения (бизнес-исключения) и исключения времени выполнения.

Извините, что это вопрос более длинный, но я вижу, что это обычный запрос, и я попытался его консолидировать. Цените свое терпение и руководство. Спасибо за вашу помощь.

Ответ 1

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

Кроме того, используйте пул соединений, очевидно. Apache Commons DBCP - отличный выбор. "Недостаточно утечки при подключении" недостаточно. У вас должна быть нулевая утечка соединения. В зависимости от Spring для управления вашими ресурсами это поможет. Что касается любых других проблем с производительностью, не пытайтесь оптимизировать преждевременно. Подождите, пока вы не увидите, где находятся ваши проблемные области, а затем выясните, как наилучшим образом решить каждый из них по отдельности. Поскольку ваши узкие места, скорее всего, связаны с базой данных, посмотрите главу производительности ссылки Hibernate, чтобы получить представление о том, что вы против, Он охватывает важные концепции кэширования и выборки стратегий.

Ответ 2

  • Используйте JPA EntityManager непосредственно в своих DAO. Обязательно не отмечайте его как Extended
  • Предпочитают <tx:annotation-driven /> и @Transactional - только на уровне обслуживания
  • Менеджер транзакций также открывает и закрывает сеансы (если он еще не существует в потоке). Здесь хорошо знать, что сеансы сеанса за запрос. Каждый запрос (= поток) имеет отдельный экземпляр сеанса. Но соединение с базой данных создается только в том случае, если это необходимо, поэтому даже если во всех методах есть менеджер транзакций, ненужные соединения не будут открыты.
  • транзакции только для чтения - используйте @Transactional(readOnly=true) в случаях, когда есть только поиск данных
  • кэширование - использование кэша второго уровня спящего режима для размещения сущностей в памяти (вместо того, чтобы извлекать их из базы данных каждый раз)
  • избегать OpenSessionInView и ленивых коллекций. Это субъективно, но, на мой взгляд, все объекты, которые покидают сервисный уровень, должны быть инициализированы. Для небольших коллекций (например, список ролей) у вас могут быть интересные коллекции. Для больших коллекций используются запросы HQL.