Мы используем систему планирования заданий, которая работает поверх DBMS_JOB. Он использует основную работу для создания разовых работ. Мы развертываем один и тот же набор заданий для всех наших клиентов, но можем указать, какие задания должны выполняться только на определенных клиентах.
Время от времени возникают проблемы с процессом, выполняемым при зависании задания. Основной причиной этого является то, что UTL_TCP не выполняет тайм-аут при получении ожидаемого ответа. Я хочу иметь возможность убивать эти задания, чтобы они могли работать снова.
Я смотрю на создание новой работы, которая убивает любую из этих одноразовых работ, которые выполнялись дольше определенного времени.
Мы еще какое-то время застряли с Oracle 10g, поэтому я ограничен тем, что это может сделать.
Есть статья, которая, кажется, покрывает большую часть этого в
http://it.toolbox.com/blogs/database-solutions/killing-the-oracle-dbms_job-6498
У меня такое ощущение, что это не охватит все возможности, в том числе:
- Мы можем выполнять задания от нескольких разных пользователей, и пользователь может только нарушать / удалять созданные ими задания. Я полагаю, что я могу использовать DBMS_IJOB, чтобы обойти это, но мне нужно, чтобы администратор БД позволил мне выполнить его.
- У нас есть системы Oracle RAC. Я понимаю, что 10g ограничивает ALTER SYSTEM KILL SESSION уничтожением сессий на текущем экземпляре. Я мог бы организовать выполнение всех заданий в одном экземпляре, но я еще не пробовал.
Что-нибудь еще, что я должен рассмотреть? Переполнение стека требует определенного ответа на этот вопрос.