Главная страница
Навигация по странице:

  • 21.6. Пример JPATransactionManager

  • Последовательность шагов

  • 4. зарегистрировали полученное соединение в ThreadLocal объекте.

  • 5. beginTransaction() prepareTransaction() commitTransaction(). 21.7. Что такое TransactionDefinition и TransactionStatus

  • 21.8 Как именно работают транзакции

  • 2. двухфазный

  • Ревью 2 теория. Инструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми


    Скачать 0.74 Mb.
    НазваниеИнструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми
    АнкорРевью 2 теория
    Дата04.09.2022
    Размер0.74 Mb.
    Формат файлаdocx
    Имя файла2.docx
    ТипИнструкция
    #661724
    страница15 из 26
    1   ...   11   12   13   14   15   16   17   18   ...   26

    21.5.2. В чем разница между Filters, Listeners and Interceptors?


    Filter выполняет задачи фильтрации либо по пути запроса к ресурсу, либо по пути ответа от ресурса, либо в обоих направлениях. Фильтры выполняют фильтрацию в методе doFilter.

    Каждый фильтр имеет доступ к объекту FilterConfig, из которого он может получить параметры инициализации, и ссылку на ServletContext. Фильтры настраиваются в дескрипторе развертывания веб-приложения.

    При создании цепочки фильтров, веб-сервер решает, какой фильтр вызывать первым, в соответствии с порядком регистрации фильтров. Когда вызывается метод doFilter(...) первого фильтра, веб-сервер создает объект FilterChain, представляющий цепочку фильтров, и передает ее в метод.

    Фильтры зависят от контейнера сервлетов, могут работать с js, css.

    Interceptor являются аналогом Filter в Spring. Перехватить запрос клиента можно в трех местах: preHandle, postHandle и afterCompletion.

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

    Чтобы добавить перехватчики в конфигурацию Spring, необходимо переопределить метод addInterceptors() внутри класса, который реализует WebMvcConfigurer.

    Interceptor основан на механизме Reflection, а фильтр основан на обратном вызове функции.

    preHandle – метод используется для обработки запросов, которые еще не были переданы в метод контроллера. Должен вернуть true для передачи следующему перехватчику или в handler method. False укажет на обработку запроса самим обработчиком и отсутствию необходимости передавать его дальше. Метод имеет возможность выкидывать исключения и пересылать ошибки к представлению.

    postHandle – вызывается после handler method, но до обработки DispatcherServlet для передачи представлению. Может использоваться для добавления параметров в объект ModelAndView. afterCompletion – вызывается после отрисовки представления.

    Listener – это класс, имплементирующий интерфейс ServletContextListener с аннотацией @WebListener.

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

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

    21.6. Пример JPATransactionManager?


    В Spring есть абстрактный класс AbstractPlatformTransactionManager, который является основным для всех TransactionManager.

    Он определяет транзакции, применяет уже сконфигурированный уровень propagation, может приостанавливать и возобновлять транзакции, установка флага rollbackOnly для определенного действия и т.д.

    Последовательность шагов:

    1. получили EntityManagerFactory;

    2. получили DataSource;

    3. исходя из диалекта (какая у нас БД) создается новая транзакция beginTransaction() т.е. Spring ничего не делает, он просто “говорит” что знает какая у нас БД и предоставляет нам соответствующий для нее диалект и т.д.;

    4. зарегистрировали полученное соединение в ThreadLocal объекте.

    Все соединения и транзакции являются потокозависимыми (все выполняется в текущем потоке), т.е. когда мы начали транзакцию в своем потоке мы не можем ее как-то напрямую расширить на другой поток (в этом случае будет начинаться новая транзакция). Разве что можно отключить транзакцию от потока и “приаттачить” к другому.

    5. beginTransaction() prepareTransaction() commitTransaction().

    21.7. Что такое TransactionDefinition и TransactionStatus?


    Это интерфейсы. TransactionDefinition содержит в себе конфигурацию транзакции, уровень изоляции и propagation. TransactionStatus возвращает статус текущей транзакции.

    21.8 Как именно работают транзакции?


    Существует стандарт XA (eXtended Architecture), который связывает источник данных (dataSource) с TransactionManager.

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

    стандарт поддерживает 2 типа коммитов:

    1. однофазный — работает с одним источником данных (1 база данных) — только 1 транзакция — либо выполнилась, либо нет;

    2. двухфазный — работает с 2 или более источником данных — имеется несколько DataSource, внутри каждого есть своя транзакция и есть 1 глобальная транзакция для этих внутренних транзакций.

    Транзакции работают в своем потоке.

    Есть такой термин как transaction context — он обязательно имеет id, который обозначает, что транзакция работает в таком-то контексте. Также может иметь другие параметры.

    1   ...   11   12   13   14   15   16   17   18   ...   26


    написать администратору сайта