Запрет тайм-аута сеанса во время обновления базы данных - PullRequest
10 голосов
/ 11 мая 2011

Фон

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

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

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

Проблема

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

Вопрос

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

Идеи

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

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

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

JavaScript Ping

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

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

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

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

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

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

Оптимизация

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

Оборудование

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

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

Ответы [ 2 ]

4 голосов
/ 12 мая 2011

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

  • Создание отчета в фоновом потоке.Поток был отслежен и доступен через список контекста приложения.В ветке содержалась информация о владельце и его ходе.
  • Пользователи могут просматривать свои собственные потоки и видеть ход выполнения.
  • После завершения поток отчета сохранит отчет для автономного доступа, отправит уведомление по электронной почтевладельцу со ссылкой для скачивания сгенерированного отчета.
1 голос
/ 11 мая 2011

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

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

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

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

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

...