Как настроить транзакцию только для чтения в GET-запросе с Guice и Jersey? - PullRequest
1 голос
/ 09 октября 2011

Я использую Guice, Guice Persist, Hibernate и Jersey.Все мои методы ресурсов помечены @Transactional, за исключением методов, которые помечены @GET.Это правильный способ настройки области транзакции на запрос?

1 Ответ

4 голосов
/ 13 марта 2012

Не существует «правильного» пути; это зависит от того, чего вы пытаетесь достичь. Существует несколько отдельных вопросов, связанных с ответом на ваш вопрос, как описано ниже.

  1. Шаблон доступа к данным. Традиционный шаблон в корпоративной Java заключается в том, чтобы ваши контроллеры обращались к DAO (объектам доступа к данным), которые обрабатывают постоянство. В этом шаблоне аннотации вашей транзакции будут размещаться в методах DAO, а не в методах контроллера. Тем не менее, многие люди считают DAO излишними и предпочитают, чтобы менеджер сущностей был введен в контроллер. Это вполне приемлемая альтернатива, и, насколько я могу судить, именно такой подход вы выбрали.
  2. Потокобезопасность: Вы должны знать, что экземпляры диспетчера сущностей не являются поточно-ориентированными, поэтому ваши контроллеры не должны быть одиночными и должны иметь объем запросов. Другими словами, вы не можете совместно использовать менеджер сущностей по нескольким запросам, поэтому вы должны настроить свои контроллеры на повторное создание и вводить нового менеджера сущностей для каждого запроса.
  3. Транзакции. Если для операции поиска данных требуется только один запрос, транзакция не требуется. Однако построение полного графа объектов обычно требует много запросов. В этом случае ваш поиск должен быть транзакционным, чтобы гарантировать согласованность, поскольку данные могут изменяться между запросами. Некоторые структуры фактически требуют, чтобы весь доступ к базе данных был транзакционным, иначе менеджер сущностей не будет введен правильно.

Таким образом, ваш шаблон доступа к данным в порядке, если ваши контроллеры находятся в области запроса. Однако ваши функции "GET" должны быть транзакционными, если в создании графа объектов будет задействовано много запросов.

...