Как я могу быть уверен, что сеанс Oracle был закрыт?

У меня есть проект Angular, который вызывает REST API в Spring. В Angular я использую класс Observable для получения объекта Subscribe при запросе API:

 this.currentSubs =
  this.entity0.post(arg0, arg1, arg2)
    .subscribe((res: any) => {
      //logic here  
    }, (err: HttpErrorResponse) => {
      //Error logic here
    });

Мой API возвращает ответ от 40 до 2 минут, и у меня нет доступа для изменения сложности или количества времени, необходимого для выполнения этого запроса. Я реализовал кнопку отмены, которая вызывает это в Angular:

this.currentSubs.unsubscribe();

И когда я отменяю использование этого кода, я получаю это исключение на сервере:

java.io.IOException: An established connection was aborted by the software in your host machine.

Поскольку я использую Spring @RestController, @Repository и StoredProcedure, я хотел бы, чтобы я мог убедиться, что закрываю все сеансы, связанные с этим запросом REST. Поскольку я использую Oracle, я мог бы использовать

SELECT   username FROM v$session 
WHERE    username IS NOT NULL 
ORDER BY username ASC;

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

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

Ответы 1

Ответ принят как подходящий

Возникает вопрос: что происходит с сервером, когда клиент умирает !? Соединение с Oracle остается активным.

Oracle имеет процесс проверки, настроенный с помощью SQLNET.EXPIRE_TIME (в минутах). Установка значения больше 0 (по умолчанию) гарантирует, что соединения не будут оставаться открытыми на неопределенный срок из-за ненормального завершения работы клиента.

Возможно, это могло бы пролить свет на вопрос: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2233109200346833212.

Является ли IOException предупреждением в вашем журнале? Если нет, возможно, вам нужно перехватить это исключение и зарегистрировать некоторую информацию об отключении клиента !?

IOException перехватывается / распечатывается классом HTTP Spring. Я обнаружил, что Spring не создает новых подключений и продолжает использовать тот же сеанс. Поскольку обработчик ошибок встроен в классы Spring, я думаю, что ваше решение здесь не нужно, но оно крайне необходимо там, где не используется расширенная структура, такая как Spring.

rado 15.05.2018 20:00

Я не уверен, но, возможно, @ControllerAdvice может помочь.

Sebastião Santos 16.05.2018 22:34

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