Фон
Веб-приложение вызывает хранимую процедуру для выполнения интенсивного обновления базы данных. Соответствующая часть web.xml
была обновлена до четырех часов:
<session-config>
<session-timeout>240</session-timeout>
</session-config>
Технологии, доступные для решения, включают Java 1.4.2, Struts 2, Tomcat 5.5 и Apache Commons. Большинство других технологий (например, jQuery) не разрешены.
Проблема
Обновление занимает около часа, однако значение конфигурации в четыре часа противоречит корпоративным стандартам (по уважительной причине). Конфигурация четырехчасового тайм-аута в производстве не допускается.
Вопрос
Что гарантирует, что время ожидания запроса не истечет во время выполнения обновления базы данных?
Идеи
В первых двух случаях меня беспокоит то, что порожденный процесс в конечном итоге будет убит контейнером сервлета.
Обновление страницы
- Запустить процесс обновления базы данных как фоновую задачу.
- Пусть сервлет постоянно обновляет страницу для проверки завершения.
Пинг JavaScript
- Запустить процесс обновления базы данных как фоновую задачу.
- Пусть код JavaScript на время отправит эхо-запрос на сервер.
Подобно Предотвращение тайм-аута сеанса в течение длительного времени обработки в JSF, но без jQuery.
Сервер обновлений
Напишите простой сервер, который слушает запросы:
- Сервлет отправляет запрос слушателю.
- Слушатель запускает обновление.
Поскольку сервер работает независимо от Tomcat, тайм-аут сеанса не может произойти. Обновление базы данных завершится без остановки. Это связано с множеством проблем (обработка ошибок - не в последнюю очередь, что меня беспокоит), и, вероятно, это крайний вариант.
Оптимизация
Оптимизация запроса до завершения менее чем за 30 минут (максимально допустимый тайм-аут) возможна, но, скорее всего, запрос не может быть оптимизирован в достаточной степени.
Аппаратное обеспечение
К сожалению, обновление оборудования базы данных не является вариантом.
Большое спасибо!