Предотвращение тайм-аута сеанса во время обновления базы данных

Фон

Веб-приложение вызывает хранимую процедуру для выполнения интенсивного обновления базы данных. Соответствующая часть web.xml была обновлена ​​до четырех часов:

<session-config>
    <session-timeout>240</session-timeout>
</session-config>

Технологии, доступные для решения, включают Java 1.4.2, Struts 2, Tomcat 5.5 и Apache Commons. Большинство других технологий (например, jQuery) не разрешены.

Проблема

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

Вопрос

Что гарантирует, что время ожидания запроса не истечет во время выполнения обновления базы данных?

Идеи

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

Обновление страницы

  1. Запустить процесс обновления базы данных как фоновую задачу.
  2. Пусть сервлет постоянно обновляет страницу для проверки завершения.

Пинг JavaScript

  1. Запустить процесс обновления базы данных как фоновую задачу.
  2. Пусть код JavaScript на время отправит эхо-запрос на сервер.

Подобно Предотвращение тайм-аута сеанса в течение длительного времени обработки в JSF, но без jQuery.

Сервер обновлений

Напишите простой сервер, который слушает запросы:

  1. Сервлет отправляет запрос слушателю.
  2. Слушатель запускает обновление.

Поскольку сервер работает независимо от Tomcat, тайм-аут сеанса не может произойти. Обновление базы данных завершится без остановки. Это связано с множеством проблем (обработка ошибок - не в последнюю очередь, что меня беспокоит), и, вероятно, это крайний вариант.

Оптимизация

Оптимизация запроса до завершения менее чем за 30 минут (максимально допустимый тайм-аут) возможна, но, скорее всего, запрос не может быть оптимизирован в достаточной степени.

Аппаратное обеспечение

К сожалению, обновление оборудования базы данных не является вариантом.

Большое спасибо!


person Dave Jarvis    schedule 11.05.2011    source источник
comment
А как насчет сеанса в memcached? code.google.com/p/memcached-session-manager   -  person lschin    schedule 11.05.2011
comment
Думаю, вы уже ответили на свой вопрос или нет? Как вы писали, вам нужно запустить обновление в качестве фоновой задачи и либо выполнить обновление страницы, либо опрос ajax, чтобы показать текущий статус задачи.   -  person Peter Štibraný    schedule 11.05.2011
comment
Tomcat не должен убивать созданные вами потоки или процессы. Конечно, если вы убьете Tomcat целиком, ваши потоки тоже исчезнут. Когда ваше приложение повторно развертывается, вы можете столкнуться с проблемами с фоновыми потоками, но администраторы должны быть осторожны с повторным развертыванием, когда выполняются фоновые задачи (и вы также можете прослушивать веб-приложение, спускающееся / поднимающееся).   -  person Peter Štibraný    schedule 11.05.2011


Ответы (2)


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

  • Сгенерируйте отчет в фоновом потоке. Поток отслеживался и был доступен через список контекста приложения. В ветке была информация о владельце и их успехах.
  • Пользователи могут составлять список своих собственных тем и видеть прогресс.
  • По завершении цепочка отчетов сохранит отчет для автономного доступа, отправит владельцу уведомление по электронной почте со ссылкой для загрузки сгенерированного отчета.
person Pierre    schedule 12.05.2011
comment
Это была внутренняя разработка. он не был слишком сложным (список потоков, генерирующий поток, который удаляется из списка после завершения, и страница мониторинга для списка). Если бы я построил его снова сегодня, я бы, вероятно, основал его на структуре планирования Quartz, поскольку я могу пере- приложить усилия для многих других вещей. - person Pierre; 13.05.2011

Читая abvoe, я могу убедиться, что у вас есть два варианта, даже если второй сложен, это лучший способ

1) Обновление страницы

  1. Запустить процесс обновления базы данных как фоновую задачу.
  2. Пусть сервлет постоянно обновляет страницу для проверки завершения.

2) Оптимизация

Оптимизация запроса до завершения менее чем за 30 минут (максимально допустимый тайм-аут) возможна, но, скорее всего, запрос не может быть оптимизирован в достаточной степени.

person developer    schedule 11.05.2011