У меня есть общедоступный сервер приложений, который обращается к базе данных Oracle, находящейся за брандмауэром.
Некоторые процессы, которые выполняются через сервер приложений, могут длиться более часа. Это заставляет брандмауэр отключать сеанс без создания каких-либо сообщений об ошибках. Это приводит к зависанию процесса.
Я установил KeepAliveInterval на 1 секунду и KeepAliveTime на два часа в реестре.
Я установил параметр enable = broken в моем файле tnsnames.ora
У слушателя время истечения срока действия sqlnet установлено на две минуты, поэтому он также отправляет сообщения проверки активности с этого конца.
Проблема в том, что это не работает. На другом компьютере я, по крайней мере, получил сообщение о том, что брандмауэр отключил сервер приложений (именно тогда я обнаружил требование enable = broken)
Как я могу убедиться, что пакеты keep-alive отправлены?
Почему брандмауэр отключает сеанс? Не настроен ли брандмауэр на закрытие соединений, которые были активны слишком долго? Или закрыть соединения, которые были неактивны слишком долго? Если брандмауэр настроен на запрет соединений, которые сохраняются более часа, вероятно, вы ничего не можете сделать в конфигурации сети - вам нужно будет изменить конфигурацию брандмауэра.
С точки зрения архитектуры, действительно ли вам нужно запускать часовые процессы на сервере приложений? Обычно для сервера приложений было бы более разумным сделать запрос, который заставляет процесс базы данных работать асинхронно (т. Е. Порождать задание, используя DBMS_SCHEDULER
или DBMS_JOB
), а затем пусть сервер приложений отслеживает ход выполнения задания. Таким образом, у вас не будет соединения, которое постоянно открыто в течение часа. И вы можете дать пользователю какой-то индикатор прогресса (особенно, если работа инструментирована, например, DBMS_APPLICATION_INFO
).
Я установил KeepAliveInterval на 1 секунду и KeepAliveTime на два часа в реестре.
Я предполагаю, что 5 секунд и 30 минут могут быть более разумными значениями (и это при условии, что время RTT меньше 5 мсек). Если брандмауэр решил исключить соединение из своей таблицы состояний, интервал поддержки активности не имеет значения.
Как я могу убедиться, что пакеты keep-alive отправлены?
С захватом пакетов по обе стороны от межсетевого экрана
На самом деле, первое, с чего вы начинаете исследовать эту проблему, - это журналы брандмауэра.