Ассинхронное обновление данных из БД

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Perecz
Сообщения: 5
Зарегистрирован: 24 окт 2006, 16:59

Здрасте всем.

Дано:
Приложение, которое по ODBC ассинхронно (по мере поступления из интернета) пуляет данные в таблицу MySQL. Структура таблицы A:

ID NAME VALUE TIME

При поступлении в нее новых данных строки не добавляются, а обновляются, причем обновляются только 2 столбца VALUE и TIME соответственно.

Задача:
Создать приложение на Delphi которое будет ассинхронно, опять же, по мере обновления данных в таблице, обрабатывать эти данные и отправлять результаты в другую таблицу, B, в той же БД.

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

Кто сталкивался, где почитать? Перерыл многое - нашел, да почти ничего не нашел..(

MySQL 5.0, Delphi 7, доступ к MySQL = ZeosDBO

Буду рад любой помощи.
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

не знаю MySQL... А триггеров там нет? ;)
Изображение
Perecz
Сообщения: 5
Зарегистрирован: 24 окт 2006, 16:59

Вроде есть, но я с ними ниразу не работал, если можно, вкратце ликбез по триггерам? :)
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Слушай, а типа в свойствах компонента который держит связь с таблицей нет AfterPost???
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Perecz, триггер - это процедура выполняемая сервером БД по определённому событию.

пример:
[syntax:541f2b142f="sql"]
-- перед вставкой новой записи присвоит GUID полю
create trigger MyTable_bi_70 for MyTable before insert position 70 as
begin
new.Guid = CREATEGUID();
end

-- зачистка зависимых таблиц после удаления записи в основной
create trigger MyTable_ad_90 for MyTable after delete position 90 as
begin
delete from MyTable1 where ID = old.ID;
delete from MyTable2 where ID = old.ID;
end
[/syntax:541f2b142f]

В вашем случае напрашивается триггер на событие After Update
Perecz
Сообщения: 5
Зарегистрирован: 24 окт 2006, 16:59

Dr_Grizzly писал(а):Слушай, а типа в свойствах компонента который держит связь с таблицей нет AfterPost???
Не-а, нету, но есть свойство OnUpdateRecord.

Т.е. складывая воедино всё, что удалось узнать получается так:

ZConnection1 - держит связь с базой, ZTable1 - держит связь с таблицей, естественно, у обеих компонент Active = True;

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

Проверил еще раз.. есть AfterApplyUpdates...

Или какие-то еще условия необходымы?

Смысл еще раз попробую пояснить...

Чужая программа через ODBC обновляет записи в БД.
Моя программа должна подгружать в себя обновившиеся значения, обрабатывать и записывать их в разные таблицы, в соответствии с разными условиями...
Ответить