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

На основе опыта я просто отмечу, что, в то время как это - C++ способ поместить раньше статические функции в анонимное пространство имен, более старые компиляторы могут иногда иметь проблемы с этим. Я в настоящее время работаю с несколькими компиляторами для наших целевых платформ, и более современный компилятор Linux соглашается с размещением функций в анонимное пространство имен.

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

104
задан Vlad Mihalcea 8 May 2017 в 09:57
поделиться

5 ответов

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

Понимание :

Использование OSIV «загрязняет» уровень представления с проблемами, связанными с уровнем доступа к данным.

Уровень представления не подготовлен к обработке HibernateException , которое может произойти при отложенной загрузке, но, предположительно, уровень доступа к данным готов.

Производительность :

OSIV имеет тенденцию затягивать правильную загрузку сущностей под ковер - вы обычно не замечаете, что ваши коллекции или сущности лениво инициализируются (возможно, N + 1). Больше удобства, меньше контроля.


Обновление: см. Антипаттерн OpenSessionInView для более подробного обсуждения этого предмета. Автор перечисляет три важных момента:

  1. каждая ленивая инициализация дает вам запрос, что означает, что каждой сущности потребуется N + 1 запросов, где N - количество ленивых ассоциаций. Если на вашем экране представлены табличные данные, чтение журнала Hibernate - большой намек на то, что вы делаете не так, как должны
  2. , это полностью разрушает многоуровневую архитектуру, поскольку вы запачкаете ногти с помощью БД на уровне представления. Это концептуальный обман, поэтому я мог бы смириться с этим, но есть следствие
  3. , последнее, но не менее важное: если во время выборки сеанса возникает исключение, оно произойдет во время написания страницы: вы не можете представить чистую ошибку странице для пользователя, и единственное, что вы можете сделать, это написать сообщение об ошибке в теле
45
ответ дан 24 November 2019 в 04:12
поделиться

Я бы не сказал, что Open Session In View считается плохой практикой; что производит у вас такое впечатление?

Open-Session-In-View - это простой подход к работе с сеансами с помощью Hibernate. Потому что это просто, а иногда и упрощенно. Если вам нужен детальный контроль над вашими транзакциями, например наличие нескольких транзакций в запросе, Open-Session-In-View не всегда является хорошим подходом.

Как отмечали другие, есть некоторые компромиссы для OSIV - вы гораздо более подвержены проблеме N + 1, потому что у вас меньше шансов понять, какие транзакции вы запускаете. В то же время это означает, что вам не нужно изменять уровень обслуживания, чтобы адаптироваться к незначительным изменениям в вашем представлении.

13
ответ дан 24 November 2019 в 04:12
поделиться

Если вы используете контейнер Inversion of Control (IoC), такой как Spring, вы можете прочитать о области видимости bean . По сути, я говорю Spring предоставить мне объект Hibernate Session , жизненный цикл которого охватывает весь запрос (т.е. он создается и уничтожается в начале и в конце HTTP-запроса). Мне не нужно беспокоиться ни о LazyLoadException , ни о закрытии сеанса, поскольку контейнер IoC управляет этим за меня.

Как уже упоминалось, вам придется подумать о проблемах производительности N + 1 SELECT. Вы всегда можете настроить свой объект Hibernate после этого, чтобы выполнять загрузку активного соединения в местах, где производительность является проблемой.

Решение для определения области действия bean не является специфичным для Spring. Я знаю, что PicoContainer предлагает те же возможности, и я

5
ответ дан 24 November 2019 в 04:12
поделиться

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

OSIV, imo, в первую очередь полезен, потому что мы можем избежать написания кода для запуска «контекста постоянства» (он же сеанс) каждый раз, когда требуется запрос для доступа к БД.

На уровне обслуживания вам, вероятно, потребуется выполнять вызовы методов, которые имеют различные потребности транзакций, такие как «Требуется, Новый Требуется и т. д.» Единственное, что нужно этим методам, это то, что кто-то (например, фильтр OSIV) запустил контекст постоянства, так что единственное, о чем они должны беспокоиться, это - «Эй, дайте мне сеанс гибернации для этого потока .. Мне нужно сделать кое-что». Материал БД ».

1
ответ дан 24 November 2019 в 04:12
поделиться

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

http://heapdump.wordpress.com/2010/04/04/should-i-use-open-session-in-view/

3
ответ дан 24 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: