|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
Здравствуйте! Посоветуйте, как лучше выполнить такую задачу: нужно, чтобы после того, как в таблице добавится строка (сработает триггер), происходил запуск приложения в винде (эти данные должны тут же в виде xml отправиться наверх с помощью приложения). Как это лучше сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2018, 14:55 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
Подскажите, хоть какие соображения, плз. Сейчас сделан опрос - т.е. коннект к базе каждые n минут - проверка, есть ли свежие данные. Хочется сделать по событию, т.к. данных может и не быть пару суток. Есть еще такой вариант - в файл на диске записывать признак наличия информации, и уже любым планировщиком мониторить файлик - тогда избежим частых коннектов к базе. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2018, 14:59 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
I.Tal, Добрый день. Внешним приложением/скриптом, запускаемым по расписанию периодически. Триггер готовит данные для приложения, складывая их в таблицу-очередь. Приложение соединяется с базой и обрабатывает очередь сообщений. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2018, 16:03 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
I.Tal, Есть простое, очевидное, элегантное, но в большинстве случаев неправильное решение. Можно сделать по внешним UDF/хранимой процедуре, но это в определённой степени извращение для таких задач. Тонкости вылезают с транзакционностью. 1) Транзакция "триггер" имеет полное право откатиться, а потом повториться (вызовет дубликаты событий). Способ бороться - транзакция-триггер - только вызывает приложение, сканирующее таблицу-очередь уже закоммиченных событий. 2) Обработчик события может не отработать по каким-то там причинам. Событие "пропадёт" Планировщик же - самое оно. Единичные коннекты раз в N секунд/минут - очень недорогая операция (скорее проверка, превратившаяся в полный скан таблицы, может сожрать больше). Главное - смотрите, чтобы база активна была (activate database ...). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2018, 02:46 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
Mark Barinstein Внешним приложением/скриптом, запускаемым по расписанию периодически. Триггер готовит данные для приложения, складывая их в таблицу-очередь. Приложение соединяется с базой и обрабатывает очередь сообщений. День добрый. Как Вы думаете, данные в таблице-очереди должны ссылаться на большие таблицы, откуда приложение будет собирать всю информацию, или делать одну готовую таблицу-очередь? И еще вопрос: можно ли создать процедуру, которая силами БД будет формировать xml, а приложение будет мониторить папку на наличие в ней файлов? Тогда наверняка придется столкнуться с транзакционностью, как пишет уважаемый CawaSPb. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2018, 15:06 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
CawaSPb Способ бороться - транзакция- триггер - только вызывает приложение , сканирующее таблицу-очередь уже закоммиченных событий. Меня интересует - для общего развития - как сделать так, как Вы описали, где об этом почитать? Я понимаю, что это не совсем надежный вариант, но интересно, как это делается. Планировщик же - самое оно. Единичные коннекты раз в N секунд/минут - очень недорогая операция (скорее проверка, превратившаяся в полный скан таблицы, может сожрать больше). Главное - смотрите, чтобы база активна была (activate database ...). Таким образом, для проверки, есть ли данные вообще - составляю маленькую табличку, где буду хранить ссылки на большие таблицы, время появления информации и результат обработки. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2018, 15:16 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
I.Tal, 1. Идея с опросом таблиц является самой неправильной. Вам придется как-то синхронизировать 2 системы, понимая какие действия обработала внешняя система, какие нет. А если восстановили БД из бэкапа или рухнула принимающая система, возникает определенный геморрой. Вариант решения: записываете события в таблицу, внешнее приложение "забирает" данные - ставит флаг или удаляет обработанные записи. Можно воспользоваться практически готовым решением - SQL replication. 2. Если откат транзакций не является критичным событием, можно обойтись, например, примитивным созданием флагов на файловой системе штатными функциями или написав/используя UDF. 3. Если транзакции критичны можно рассмотреть механизм CDC c MQ replication. Andy ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2018, 15:30 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
Имхо, оптимально: 1. Буферная таблица с нумерацией (и / или таймштампом) записей. Если XML делается на основе изменений и скорость позволяет - триггер пишет XML прямо в поле XML записей буфера. Если создание XML требует комплексного поиска - в буфер пишем ссылки на данные, чтобы потом их обработать. При OLTP триггер д.б. шустрым. Транзакционная целостность соблюдается. 2. Отдельный сервис читает буфер и отправляет наружу что надо - фиксируя последнюю отправленную запись где-то у себя или в удаленном сервисе (он может просить данные "начиная с"). Если допускает бизнес и нужно много поиска по остальной базе - готовит отправку в периоды низкой нагрузки. 3. Когда записей в буфере станет много - нужен сборщик мусора в буфере, в периоды низкой нагрузки. Остальные варианты требуют или платных фич (MQ), или внешних шин (JavaEE, например). И без буфера в базе придется решать проблему с возможным откатом транзакций - триггер сработал, а данных уже нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2018, 19:01 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
Добрые люди, спасибо. Есть много информации к размышлению. Будет буферная таблица с таймштампом и отметкой выполненной операции, сервис отдельно, который мониторит буфер, собирает инфу и готовит файлы на отправку, сборщик мусора. Репликации не может быть - на принимающей стороне "черный ящик". Одно осталось невыясненным: триггер, который вызывает приложение - подскажите, где об этом прочитать? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2018, 15:00 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
I.Tal, Добрый день. Триггер не должен вызывать никаких приложений. Это опасный дизайн системы. Триггер должен готовить данные для внешнего по отношению к базе приложения / скрипта, которое в свою очередь и должно вызывать нужное приложение. Если очень надо, и это возможно, то заверните логику приложения в хранимую процедуру и вызывайте из триггера по событию. Но только не внешнее приложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2018, 18:06 |
|
Запуск приложения по событию в БД
|
|||
---|---|---|---|
#18+
I.Tal, Mark BarinsteinТриггер не должен вызывать никаких приложений. Это опасный дизайн системы. Триггер должен готовить данные для внешнего по отношению к базе приложения / скрипта, которое в свою очередь и должно вызывать нужное приложение. Если очень надо, и это возможно, то заверните логику приложения в хранимую процедуру и вызывайте из триггера по событию. Но только не внешнее приложение. Я бы сказал, что если очень-очень надо, то триггер (внешняя функция/хранимая процедура, дергаемая триггером) может запускать внешнее приложение, которое обладает определёнными характеристиками: - приложение (код ф-и/процедуры) отрабатывает очень быстро и не делает НИЧЕГО. - кромо как или а) посылает синал своей серверной части - "пора!", или б) запускает в параллель дополнительный процесс. Та "серверная часть" не делает ничего, основываясь только на том факте, что "её позвали", а вновь лезет к базе и ищет дополнительную отметку, оставленную "запускающей" транзакцией. - Если "запускающая" транзакция откатится, то запустившееся приложение ничего не обнаружит и тихо закроется. - Пока "запускающая" транзакция не завершилась, "серверная часть" будет ждать в блокировке (надо сделать так, чтобы ждала). Схема отодвинет вопрос согласованности транзакций лишь чуть дальше - приложение должно будет обеспечивать эту согласованность самостоятельно. Например, приложение может просто закрыться. Потому что может. Или потому что рубильник выключили. И т.п. Схема имеет хоть какой-то смысл если вам действительно надо, чтобы по факту изменений что-то отрабатывало не через 5 секунд, и не через одну, а "вот прям сразу", и к архитектуре приложения, изменяющего базу, вы доступа не имеете. И то, весьма вероятно, Q-Replication/CDC replication будут гораздо более надёжными средствами. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 13:09 |
|
|
start [/forum/topic.php?fid=43&gotonew=1&tid=1600294]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
10ms |
get first new msg: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 319ms |
total: | 462ms |
0 / 0 |