Как настроить транзакцию только для чтения в запросе GET с помощью Guice и Jersey?

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


person GuidoMB    schedule 09.10.2011    source источник


Ответы (1)


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

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

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

person Jared O'Connor    schedule 13.03.2012