Hibernate сессии REST производительность / безопасность - PullRequest
1 голос
/ 15 июля 2011

Введение

Я использую веб-сервис REST, использующий Hibernate и Jersey для предоставления данных JSON мобильным клиентам. У меня есть общий вопрос о как внутренне работать с сессиями Hibernate . Есть два разных подхода (A, B), которые я хотел бы обсудить.

Подходы

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

Хотя я читал это:

"Sessions are irrelevant" <a href="http://www.prescod.net/rest/mistakes/" rel="nofollow">Common REST Mistakes, 6. </a>

B. Прямо сейчас я использую SessionFactory, чтобы открыть сеанс в моих классах обслуживания и закрыть этот сеанс сразу после выполнения запроса. Мой веб-сервис использует только запросы GET и POST. Здесь нет ни PUT, ни DELETE. Мне не нужно никакой аутентификации пользователя (например, oAuth) для запроса данных. Поэтому я не считаю необходимым использовать транзакции

Вот пример моего класса обслуживания:

Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction(); 

Query query = session.createQuery("from RoomEntity");   
@SuppressWarnings("unchecked")
List<RoomEntity> list = (List<RoomEntity>) query.list();

session.close();


Вопросы * * 1023 Было бы здорово услышать ваше мнение о моих следующих вопросах: Какая была бы лучшая практика? Какой подход вы используете?
Что вы думаете о производительности?
Что вы думаете о безопасности?

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Мне не нравится A. Это делает вашу службу состоящей из состояний, и как вы узнаете, когда пользователь закончил с вашими услугами в любом случае?

Общее правило для Hibernate и веб-приложений заключается в использовании одного сеанса на HTTP-запрос . Большинство запросов GET службы REST довольно просто отображаются на один запрос к БД, как вы продемонстрировали с помощью B, так что это путь.

1 голос
/ 01 июня 2016

Я в похожей ситуации.На основании документации JBOSS сеанс на запрос в Джерси представляется действительным.Вы можете использовать реализацию ContainerRequestFilter в Джерси, чтобы открыть сеанс гибернации, а затем закрыть его коммитами в реализации ContainerResponseFilter.

1 голос
/ 15 июля 2011

У вас должен быть один сеанс на запрос, который называется шаблоном «Работа в рабочем режиме».Существуют фреймворки, которые поддерживают эту реализацию, одна из них - Spring (я бы рекомендовал использовать ее, а не пытаться изобретать колесо).Вы можете прочитать об этом здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...