Почему кажется, что Hibernate предназначен для кратковременных сеансов?

StackOverflow https://stackoverflow.com/questions/124453

  •  02-07-2019
  •  | 
  •  

Вопрос

Я знаю, что это субъективный вопрос, но почему Hibernate, похоже, рассчитан на кратковременные сеансы?Обычно в своих приложениях я создаю DAO для абстрагирования моего уровня данных, но поскольку я не могу предсказать, как будут использоваться объекты entity, некоторые из его коллекций загружаются с задержкой, или я бы сказал, не загружаются после закрытия сеанса.

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

Это было полезно?

Решение

Потому что, как только вы выйдете за пределы своей транзакции, вы не сможете снова обратиться к базе данных, не запустив новую транзакцию.Наличие длительных транзакций "на всякий случай" - это плохо (tm).

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

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

Я работал над настольным приложением, которое использовало EJB и Hibernate.Мы должны были установить lazy=false везде, потому что, когда объекты сериализуются, они теряют способность извлекаться из серверной части.К сожалению, именно так все и происходит.

Если вас беспокоит производительность, вы могли бы использовать кэширование в бэкэнде, чтобы ваши неспешные выборки были не такими болезненными.

Вы ищете шаблон OpenSessionInView, который по сути является концептуальным фильтром (и иногда реализуется как фильтр сервлетов), который определяет, когда сеанс необходимо прозрачно повторно открыть.Несколько фреймворков реализуют это, поэтому он обрабатывает это автоматически.

Я пишу настольное приложение, поэтому использование фильтра неприменимо.

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

Если вы посмотрите на MS ADO.NET, вы увидите аналогичный акцент на поддержании подключений открытыми в течение короткого времени - у них есть целая автономная модель для обновления отключенных данных, а затем применения к базе данных, когда вы будете готовы.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top