powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запуск приложения по событию в БД
11 сообщений из 11, страница 1 из 1
Запуск приложения по событию в БД
    #39716172
I.Tal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Посоветуйте, как лучше выполнить такую задачу: нужно, чтобы после того, как в таблице добавится строка (сработает триггер), происходил запуск приложения в винде (эти данные должны тут же в виде xml отправиться наверх с помощью приложения). Как это лучше сделать?
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39717681
I.Tal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, хоть какие соображения, плз. Сейчас сделан опрос - т.е. коннект к базе каждые n минут - проверка, есть ли свежие данные. Хочется сделать по событию, т.к. данных может и не быть пару суток.
Есть еще такой вариант - в файл на диске записывать признак наличия информации, и уже любым планировщиком мониторить файлик - тогда избежим частых коннектов к базе.
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39717723
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
I.Tal,

Добрый день.

Внешним приложением/скриптом, запускаемым по расписанию периодически.
Триггер готовит данные для приложения, складывая их в таблицу-очередь.
Приложение соединяется с базой и обрабатывает очередь сообщений.
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39717888
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I.Tal,

Есть простое, очевидное, элегантное, но в большинстве случаев неправильное решение.
Можно сделать по внешним UDF/хранимой процедуре, но это в определённой степени извращение для таких задач. Тонкости вылезают с транзакционностью.
1) Транзакция "триггер" имеет полное право откатиться, а потом повториться (вызовет дубликаты событий). Способ бороться - транзакция-триггер - только вызывает приложение, сканирующее таблицу-очередь уже закоммиченных событий.
2) Обработчик события может не отработать по каким-то там причинам. Событие "пропадёт"

Планировщик же - самое оно. Единичные коннекты раз в N секунд/минут - очень недорогая операция (скорее проверка, превратившаяся в полный скан таблицы, может сожрать больше). Главное - смотрите, чтобы база активна была (activate database ...).
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39718210
I.Tal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
Внешним приложением/скриптом, запускаемым по расписанию периодически.
Триггер готовит данные для приложения, складывая их в таблицу-очередь.
Приложение соединяется с базой и обрабатывает очередь сообщений.

День добрый.
Как Вы думаете, данные в таблице-очереди должны ссылаться на большие таблицы, откуда приложение будет собирать всю информацию, или делать одну готовую таблицу-очередь?
И еще вопрос: можно ли создать процедуру, которая силами БД будет формировать xml, а приложение будет мониторить папку на наличие в ней файлов? Тогда наверняка придется столкнуться с транзакционностью, как пишет уважаемый CawaSPb.
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39718218
I.Tal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CawaSPb
Способ бороться - транзакция- триггер - только вызывает приложение , сканирующее таблицу-очередь уже закоммиченных событий.

Меня интересует - для общего развития - как сделать так, как Вы описали, где об этом почитать? Я понимаю, что это не совсем надежный вариант, но интересно, как это делается.

Планировщик же - самое оно. Единичные коннекты раз в N секунд/минут - очень недорогая операция (скорее проверка, превратившаяся в полный скан таблицы, может сожрать больше). Главное - смотрите, чтобы база активна была (activate database ...).
Таким образом, для проверки, есть ли данные вообще - составляю маленькую табличку, где буду хранить ссылки на большие таблицы, время появления информации и результат обработки.
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39718236
A.Panskikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
I.Tal,

1. Идея с опросом таблиц является самой неправильной. Вам придется как-то синхронизировать 2 системы, понимая какие действия обработала внешняя система, какие нет. А если восстановили БД из бэкапа или рухнула принимающая система, возникает определенный геморрой.

Вариант решения: записываете события в таблицу, внешнее приложение "забирает" данные - ставит флаг или удаляет обработанные записи. Можно воспользоваться практически готовым решением - SQL replication.

2. Если откат транзакций не является критичным событием, можно обойтись, например, примитивным созданием флагов на файловой системе штатными функциями или написав/используя UDF.

3. Если транзакции критичны можно рассмотреть механизм CDC c MQ replication.

Andy
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39718395
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имхо, оптимально:

1. Буферная таблица с нумерацией (и / или таймштампом) записей.
Если XML делается на основе изменений и скорость позволяет - триггер пишет XML прямо в поле XML записей буфера.
Если создание XML требует комплексного поиска - в буфер пишем ссылки на данные, чтобы потом их обработать.
При OLTP триггер д.б. шустрым.
Транзакционная целостность соблюдается.

2. Отдельный сервис читает буфер и отправляет наружу что надо - фиксируя последнюю отправленную запись где-то у себя или в удаленном сервисе (он может просить данные "начиная с"). Если допускает бизнес и нужно много поиска по остальной базе - готовит отправку в периоды низкой нагрузки.

3. Когда записей в буфере станет много - нужен сборщик мусора в буфере, в периоды низкой нагрузки.

Остальные варианты требуют или платных фич (MQ), или внешних шин (JavaEE, например). И без буфера в базе придется решать проблему с возможным откатом транзакций - триггер сработал, а данных уже нет.
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39720006
I.Tal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрые люди, спасибо. Есть много информации к размышлению. Будет буферная таблица с таймштампом и отметкой выполненной операции, сервис отдельно, который мониторит буфер, собирает инфу и готовит файлы на отправку, сборщик мусора. Репликации не может быть - на принимающей стороне "черный ящик".

Одно осталось невыясненным: триггер, который вызывает приложение - подскажите, где об этом прочитать?
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39720121
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
I.Tal,

Добрый день.

Триггер не должен вызывать никаких приложений. Это опасный дизайн системы.
Триггер должен готовить данные для внешнего по отношению к базе приложения / скрипта, которое в свою очередь и должно вызывать нужное приложение.

Если очень надо, и это возможно, то заверните логику приложения в хранимую процедуру и вызывайте из триггера по событию. Но только не внешнее приложение.
...
Рейтинг: 0 / 0
Запуск приложения по событию в БД
    #39720852
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I.Tal,

Mark BarinsteinТриггер не должен вызывать никаких приложений. Это опасный дизайн системы.
Триггер должен готовить данные для внешнего по отношению к базе приложения / скрипта, которое в свою очередь и должно вызывать нужное приложение.

Если очень надо, и это возможно, то заверните логику приложения в хранимую процедуру и вызывайте из триггера по событию. Но только не внешнее приложение.
Я бы сказал, что если очень-очень надо, то триггер (внешняя функция/хранимая процедура, дергаемая триггером) может запускать внешнее приложение, которое обладает определёнными характеристиками:
- приложение (код ф-и/процедуры) отрабатывает очень быстро и не делает НИЧЕГО.
- кромо как или а) посылает синал своей серверной части - "пора!", или б) запускает в параллель дополнительный процесс.

Та "серверная часть" не делает ничего, основываясь только на том факте, что "её позвали", а вновь лезет к базе и ищет дополнительную отметку, оставленную "запускающей" транзакцией.
- Если "запускающая" транзакция откатится, то запустившееся приложение ничего не обнаружит и тихо закроется.
- Пока "запускающая" транзакция не завершилась, "серверная часть" будет ждать в блокировке (надо сделать так, чтобы ждала).

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

Схема имеет хоть какой-то смысл если вам действительно надо, чтобы по факту изменений что-то отрабатывало не через 5 секунд, и не через одну, а "вот прям сразу", и к архитектуре приложения, изменяющего базу, вы доступа не имеете.
И то, весьма вероятно, Q-Replication/CDC replication будут гораздо более надёжными средствами.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запуск приложения по событию в БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]