Как запланировать обычные задачи по очистке базы данных в классическом ASP?
-
19-09-2019 - |
Вопрос
У меня есть классический сайт ASP, который требует, чтобы некоторые таблицы базы данных были опустошены из данных сеанса по расписанию. Эта система не имеет доступа к запланированным задачам (она находится на общем веб -хосте и с использованием сервера MySQL)
Я думал об использовании global.asa
, чтобы снять события как таковые:
Application_OnStart
- Удалить все данные сеанса из базы данныхApplication_OnEnd
- Удалить все данные сеансаSession_OnStart
- Создать сеанс пользователяSession_OnEnd
- Удалить все данные сеанса, которые относятся к этому сеансу.
Есть ли причина, по которой я не должен создавать подключения к базе данных в global.asa
? Они будут созданы и уничтожены здесь, не обмениваны сессией или применением приложений. Я рассматриваю это как способ выполнения этих задач администратора дважды на пользователя (при запуске сеанса и заканчивании) и больше не запускается для них, приравнивая очень небольшой трафик базы данных.
У кого -нибудь есть идеи относительно того, почему это может быть плохо? Любые причины не подключаться к базе данных в global.asa
?
Если кто -то думает, что вышеупомянутая идея плохая - у вас есть какие -либо другие мысли о том, как я могу регулярно опустошить эти таблицы без одного или нескольких: из:
- Запланированное задание
- Запланированная база данных
- Запуск кода на странице загрузки на каждую страницу (отсюда
Session_OnStart
крючки)
Та
Старший кокос
Решение
Я бы сделал уборку для одного сеанса в Session_OnEnd
и для всех сессий в Application_OnStart
. Анкет Если ваш All-Sessions-Cleanup медленная, вы можете сделать уродливую вещь и поместить эту очистку в отдельный ASP-файл, который вы делаете HTTP-запрос для использования класса XMLHTTP, не забывайте не ждать, пока запрос завершится как он не начнет быть обслуживаемым до того, как весь код в Application_OnStart
бег.
Другие советы
Вы можете написать веб -страницу, которая опустошает таблицы сеансов, и вызвать эту страницу из внешнего поле с помощью запланированной задачи.
Это зависит от того, сколько времени займут ваши задачи очистки. Поскольку никакие запросы не будут обслуживаться во время работы Application_start, он может заблокироваться на некоторое время.
Более того, у вас нет гарантии, что Application_end (или Session_end) будет вызвана во всех случаях (когда сервер будет выключен, он не может быть запущен, или какой -то катастрофический сбой может полностью обойти эти события).
Лучшим способом, как вы предлагаете, лучше всего запустить запланированную задачу, отвечающую за очистку данных несвежих сеансов.
Если у вас есть постоянный трафик, вы можете сгутить небольшие задачи в конце цикла запроса. Просто выпустите response.flush, а затем выполните запросы DB. Конечно, вам нужно написать свой собственный планировщик. Другим вариантом является создание отдельного файла ASP (Tasklet), который вы пингите, используя сервер, асинхронизированное, xmlhttpreq в начале запроса. Это удерживает код очистки из цикла запросов клиентов и уменьшает задержку.
На самом деле я не буду удивлен, если еще нет какого -то умного, основанного на Appengine WebApp/API, который может пинговать ваш устаревший Tasklet/Webhooks по расписанию. И если нет, вы могли бы написать один, вы сами, варианты бесконечны :)