Как закрыть и открыть новый сеанс гибернации в случае исключения

Контекст / настройка

Мы используем шаблон фильтра открытого сеанса в разговоре в нашем приложении с интеграцией Spring и Hibernate.

Мы используем декларативное управление транзакциями Springs с использованием org.springframework.transaction.interceptor.TransactionProxyFactoryBean.

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

Проблема

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

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

Мне нужна помощь в написании решения, в котором я могу закрыть существующий сеанс и открыть новый и присоединить последний сеанс к потоку с помощью TransactionSynchronizationManager, но не знаю, как это сделать, поскольку есть много мест, где мне может потребоваться это сделать в flow, есть ли общий способ сделать это? И это вообще правильный дизайн?

И даже если я достигну этого, как насчет сущностей, которые были отсоединены от предыдущего сеанса, как я могу автоматически подключиться к новому сеансу, чтобы прокси-серверы работали без проблем?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
271
1

Ответы 1

We are using open-session-in-conversation-filter pattern in our application w/ Spring & Hibernate integration.

Шаблон COnversation, как и расширенный контекст сохранения в Java EE, работает точно так же, как вы описали здесь. Если вы получите Exception, вам придется все отбросить и начать с нуля.

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

Однако что, если состояние объекта всегда будет вызывать исключение? Как можно определить сущность и просто проигнорировать ее? Что, если он связан с другими объектами.

Поэтому простого решения этой проблемы нет. Что вы можете сделать:

  1. Захватите начальное состояние, используя начальные объекты, которые вы читаете из БД, и сохраните его в HttpSession, Redis и т. д.
  2. Сохраните информацию, отправленную пользователем, поэтому, если вы получите исключение, вы можете повторно визуализировать пользовательский интерфейс с теми же изменениями вместе с сообщением об ошибке.

Таким образом, пользователи не потеряют внесенные изменения и, основываясь на сообщении об ошибке, могут повторить попытку после внесения исправлений.

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

Mayur 17.04.2018 15:05

Да, вам придется сделать это вручную. Вот почему вам лучше сделать то, что я вам предлагал.

Vlad Mihalcea 17.04.2018 17:21

Другие вопросы по теме