Подскажите как можно по таймеру вставлять записи
в Interbase 7 + IBX .( примерно от 1 до 10-20 записей в секунду)?
У меня никак не сихронизируется с формой приложения.
Одиночно записи вставляются, но ка ктолько "сажу" все на таймер,
то получаю очень много записей на SQL сервере и они какието
обрезанные.
В чем проблема не пойму?
Здравствуйте, solon, Вы писали:
S> Подскажите как можно по таймеру вставлять записи S>в Interbase 7 + IBX .( примерно от 1 до 10-20 записей в секунду)? S>У меня никак не сихронизируется с формой приложения. S>Одиночно записи вставляются, но ка ктолько "сажу" все на таймер, S>то получаю очень много записей на SQL сервере и они какието S>обрезанные. S>В чем проблема не пойму?
Здравствуйте, Romkin, Вы писали:
R>Здравствуйте, solon, Вы писали:
S>> Подскажите как можно по таймеру вставлять записи S>>в Interbase 7 + IBX .( примерно от 1 до 10-20 записей в секунду)? S>>У меня никак не сихронизируется с формой приложения. S>>Одиночно записи вставляются, но ка ктолько "сажу" все на таймер, S>>то получаю очень много записей на SQL сервере и они какието S>>обрезанные. S>>В чем проблема не пойму?
R>Ошибка в 17 строке
Здравствуйте, solon, Вы писали:
S>>> Подскажите как можно по таймеру вставлять записи S>>>в Interbase 7 + IBX .( примерно от 1 до 10-20 записей в секунду)? S>>>У меня никак не сихронизируется с формой приложения. S>>>Одиночно записи вставляются, но ка ктолько "сажу" все на таймер, S>>>то получаю очень много записей на SQL сервере и они какието S>>>обрезанные. S>>>В чем проблема не пойму?
"Дорогие ученые. У меня который год в подполе происходит подземный стук. Объясните, пожалуйста, как он происходит".
"Сказка о тройке" АБС.
R>>Ошибка в 17 строке
S>А что означает "Ошибка в 17 строке" ???
"- Василий Иваныч, ты, эта, — скока?
— Ту-134.
— Чего "Ту-134"?!
— А чего "скока"?
"
Это означает, что в вопросе отсутствует дополнительная информация,
необходимая для ответа, которую следует дать, если есть желание получить ответ.
S>>>У меня никак не сихронизируется с формой приложения.
S>>>Одиночно записи вставляются, но ка ктолько "сажу" все на таймер, S>>>то получаю очень много записей на SQL сервере
И что тут удивительного? Вполне логично... если по таймеру вставлять записи, то их там много и окажется.
S>>>и они какието обрезанные.
Что значит обрезанные?
Ладно , дошло и до меня в чём проблема:
не туда оператор End вставил и цикл не там где надо был
Так что спасибо вам за "Ту-134"
Вот второй вопрос у меня серьезный:
Каким образом можно передать клиентам, что данные
в конкретной таблице Интербайс изменились. В старых
версиях Интербейс я делал просто
"отсоединение — присоединение". А теперича как?
Использую IBX:
На серверной части у меня крутиться приложение с компонентами
TIBDatabase;
TIBTransaction;
TIBStoredProc;
IBTable1: TIBTable;
Здравствуйте, solon, Вы писали:
S>Вот второй вопрос у меня серьезный: S> Каким образом можно передать клиентам, что данные S>в конкретной таблице Интербайс изменились. В старых S>версиях Интербейс я делал просто S>"отсоединение — присоединение". А теперича как? S>Использую IBX: S> На серверной части у меня крутиться приложение с компонентами S> TIBDatabase; S> TIBTransaction; S> TIBStoredProc; S> IBTable1: TIBTable;
Если уровень изоляции транзакции TIBTransaction выставлен в ReadCommited, то достаточно закрыть/открыть TIBTable, подсоединённый к ней.
Если же установлен Snapshot, то надо закрыть/открыть саму транзакцию (Commit(), затем StartTransaction() (или BeginTransaction() — не помню точно)) и снова открыть TIBTable.
Здравствуйте, mrhru, Вы писали:
M>Здравствуйте, solon, Вы писали:
S>>Вот второй вопрос у меня серьезный: S>> Каким образом можно передать клиентам, что данные S>>в конкретной таблице Интербайс изменились. В старых S>>версиях Интербейс я делал просто S>>"отсоединение — присоединение". А теперича как? S>>Использую IBX: S>> На серверной части у меня крутиться приложение с компонентами S>> TIBDatabase; S>> TIBTransaction; S>> TIBStoredProc; S>> IBTable1: TIBTable;
M>Если уровень изоляции транзакции TIBTransaction выставлен в ReadCommited, то достаточно закрыть/открыть TIBTable, подсоединённый к ней. M>Если же установлен Snapshot, то надо закрыть/открыть саму транзакцию (Commit(), затем StartTransaction() (или BeginTransaction() — не помню точно)) и снова открыть TIBTable.
Да действительно:
// В первом случае достаточно в TIBTransaction.Params добавить две строки
//isc_tpb_read_committed,
//isc_tpb_no_rec_version
//опрашиваю по таймеру-есть ли новые записи с частотой 250 мсек.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Посмотрим обновленные данные
//IBTable1.Close; // может работать и
// IBTable1.Open; // без переоткрытия
IBTable1.Refresh;
IbTable1.Last;
//..нужна последняя запись
end;
Это всё работает, но загружает процессор почти на 100 процентов
да и плюс сетку тоже нагружает на тот случай когда запрашиваем
есть ли новые записи, а их пока нет.
МОЖЕТ ВСЕТАКИ НА САМОМ ИНТЕРБАЙСЕ ЕСТЬ ОПЦИЯ НАСТРАИВАЕМАЯ,
КОТОРАЯ ПОСЫЛАЕТ ОБНОВЛЕННЫЕ ДАННЫЕ ПОДСОЕДИНЕННЫМ КЛИЕНТАМ
(ОТКРЫТЫМ ТАБЛИЦАМ)???
Здравствуйте, solon, Вы писали:
S>//опрашиваю по таймеру-есть ли новые записи с частотой 250 мсек. S>procedure TForm1.Timer1Timer(Sender: TObject); S>begin S>//Посмотрим обновленные данные S> //IBTable1.Close; // может работать и S>// IBTable1.Open; // без переоткрытия S> IBTable1.Refresh; S> IbTable1.Last; S>//..нужна последняя запись S>end;
S>Это всё работает, но загружает процессор почти на 100 процентов S>да и плюс сетку тоже нагружает на тот случай когда запрашиваем S>есть ли новые записи, а их пока нет. S> МОЖЕТ ВСЕТАКИ НА САМОМ ИНТЕРБАЙСЕ ЕСТЬ ОПЦИЯ НАСТРАИВАЕМАЯ, S>КОТОРАЯ ПОСЫЛАЕТ ОБНОВЛЕННЫЕ ДАННЫЕ ПОДСОЕДИНЕННЫМ КЛИЕНТАМ S>(ОТКРЫТЫМ ТАБЛИЦАМ)???
Опрашивать о новых записях можно и менее ресурсоёмко.
Например, снабжаем каждую запись уникальным ID (который почти наверняка уже есть ), создаваемым в триггере на вставку с помощью отдельного генератора.
А затем по таймеру получаем значение этого генератора и сравниваем с запомненым. При изменении — refresh.
Для получения значения генератора лучше всего использовать TIBSQL и запрос:
SELECT GEN_ID( MY_GENERATOR, 0) AS ID FROM RDB$DATABASE;
Далее, если записи в таблицу могут только вставляться, то вместо полного обновления IBTable1.Refresh (тяжёлая процедура), дешевле просто получать новые записи (по тому же ID) и отображать их (уже вручную).
Другой способ получения уведомлений — компонент TIBEvent. С его помощью регистрируем на сервере события, в которых заинтересованы.
На самом сервере в триггерах при наступлении события выполняем POST_EVENT <строка>. TIBEvent получает его и делаем refresh.
При этом не надо постоянно опрашивать сервер, но сама работа с events — требует аккуратности.
Здравствуйте, mrhru, Вы писали:
M>Здравствуйте, solon, Вы писали:
S>>//опрашиваю по таймеру-есть ли новые записи с частотой 250 мсек. S>>procedure TForm1.Timer1Timer(Sender: TObject); S>>begin S>>//Посмотрим обновленные данные S>> //IBTable1.Close; // может работать и S>>// IBTable1.Open; // без переоткрытия S>> IBTable1.Refresh; S>> IbTable1.Last; S>>//..нужна последняя запись S>>end;
S>>Это всё работает, но загружает процессор почти на 100 процентов S>>да и плюс сетку тоже нагружает на тот случай когда запрашиваем S>>есть ли новые записи, а их пока нет. S>> МОЖЕТ ВСЕТАКИ НА САМОМ ИНТЕРБАЙСЕ ЕСТЬ ОПЦИЯ НАСТРАИВАЕМАЯ, S>>КОТОРАЯ ПОСЫЛАЕТ ОБНОВЛЕННЫЕ ДАННЫЕ ПОДСОЕДИНЕННЫМ КЛИЕНТАМ S>>(ОТКРЫТЫМ ТАБЛИЦАМ)???
M>Опрашивать о новых записях можно и менее ресурсоёмко. M>Например, снабжаем каждую запись уникальным ID (который почти наверняка уже есть ), создаваемым в триггере на вставку с помощью отдельного генератора. M>А затем по таймеру получаем значение этого генератора и сравниваем с запомненым. При изменении — refresh.
M>Для получения значения генератора лучше всего использовать TIBSQL и запрос:
M>SELECT GEN_ID( MY_GENERATOR, 0) AS ID FROM RDB$DATABASE;
M>Далее, если записи в таблицу могут только вставляться, то вместо полного обновления IBTable1.Refresh (тяжёлая процедура), дешевле просто получать новые записи (по тому же ID) и отображать их (уже вручную).
M>Другой способ получения уведомлений — компонент TIBEvent. С его помощью регистрируем на сервере события, в которых заинтересованы. M>На самом сервере в триггерах при наступлении события выполняем POST_EVENT <строка>. TIBEvent получает его и делаем refresh. M>При этом не надо постоянно опрашивать сервер, но сама работа с events — требует аккуратности.
1.Правильно ли я Вас понял, что для второго случая с TIBEvent,
что когда вcтавляются новые записи с помощью триггера, последней строкой в триггере
должно быть POST_EVENT <строка>. Тоесть как увязывается воедино:
выполнение запроса на вставку новой записи на сервере
и посылка события POST_EVENT <строка> вставки новой записи с сервера?
2. Я не могу понять как работает в Делфях пример IBXEvents:
открываю базу events.gdb,генерирую событие MyEvent, но две последние
кнопки не работают: Event Registation и Event Received ???
Тоесть в листбокс ничего не вижу???
Здравствуйте, solon, Вы писали:
M>>Другой способ получения уведомлений — компонент TIBEvent. С его помощью регистрируем на сервере события, в которых заинтересованы. M>>На самом сервере в триггерах при наступлении события выполняем POST_EVENT <строка>. TIBEvent получает его и делаем refresh. M>>При этом не надо постоянно опрашивать сервер, но сама работа с events — требует аккуратности.
S>1.Правильно ли я Вас понял, что для второго случая с TIBEvent, S>что когда вcтавляются новые записи с помощью триггера, последней строкой в триггере S>должно быть POST_EVENT <строка>. Тоесть как увязывается воедино: S> выполнение запроса на вставку новой записи на сервере S> и посылка события POST_EVENT <строка> вставки новой записи с сервера?
Перефразирую (чтобы мне было понятнее )
В любом месте на сервере — в триггерах или хранимых процедурах — можно вызвать
POST_EVENT <строка>;
При этом, ПОСЛЕ коммита транзакции, в которой этот триггер или ХП работала,
к клиенту уйдёт событие <строка>, если клиент заранее (т.е. до начала транзакции) на
это событие (<строка>) подписался. И будут приходить, пока клиент не отпишется от событий.
Такой, вкратце, механизм событий.
Следовательно, для получения извещений о новых записях, следует:
— на таблице создать триггер before_ или after_insert или использовать существующий
— добавить в него
POST_EVENT <строка>;
например
POST_EVENT 'NewRow';
— в IBEvents, в свойстве Events добавить строку NewRow
— установить AutoRegister или Registered по потребностям
— написать обработчик для события IBEvents.OnEventAlert, который как раз и будет вызываться по приходу события.
S>2. Я не могу понять как работает в Делфях пример IBXEvents: S> открываю базу events.gdb,генерирую событие MyEvent, но две последние S> кнопки не работают: Event Registation и Event Received ??? S> Тоесть в листбокс ничего не вижу???
В Event Registation надо добавить строку "MyEvent" и зарегистрировать.
Можно добавить сразу несколько:
aaa
bbb
ccc
После этого, вводим в Event какое-либо из зарегистрированных, нажимаем Generate Event и получаем его в Event Received.
Послав незарегистрированное, в Event Received ничего и не получим.
Здравствуйте, mrhru, Вы писали:
M>Здравствуйте, solon, Вы писали:
M>>>Другой способ получения уведомлений — компонент TIBEvent. С его помощью регистрируем на сервере события, в которых заинтересованы. M>>>На самом сервере в триггерах при наступлении события выполняем POST_EVENT <строка>. TIBEvent получает его и делаем refresh. M>>>При этом не надо постоянно опрашивать сервер, но сама работа с events — требует аккуратности.
S>>1.Правильно ли я Вас понял, что для второго случая с TIBEvent, S>>что когда вcтавляются новые записи с помощью триггера, последней строкой в триггере S>>должно быть POST_EVENT <строка>. Тоесть как увязывается воедино: S>> выполнение запроса на вставку новой записи на сервере S>> и посылка события POST_EVENT <строка> вставки новой записи с сервера?
M>Перефразирую (чтобы мне было понятнее ) M>В любом месте на сервере — в триггерах или хранимых процедурах — можно вызвать M>POST_EVENT <строка>; M>При этом, ПОСЛЕ коммита транзакции, в которой этот триггер или ХП работала, M>к клиенту уйдёт событие <строка>, если клиент заранее (т.е. до начала транзакции) на M>это событие (<строка>) подписался. И будут приходить, пока клиент не отпишется от событий. M>Такой, вкратце, механизм событий.
M>Следовательно, для получения извещений о новых записях, следует: M>- на таблице создать триггер before_ или after_insert или использовать существующий M>- добавить в него M>POST_EVENT <строка>; M>например M>POST_EVENT 'NewRow'; M>- в IBEvents, в свойстве Events добавить строку NewRow M>- установить AutoRegister или Registered по потребностям M>- написать обработчик для события IBEvents.OnEventAlert, который как раз и будет вызываться по приходу события.
S>>2. Я не могу понять как работает в Делфях пример IBXEvents: S>> открываю базу events.gdb,генерирую событие MyEvent, но две последние S>> кнопки не работают: Event Registation и Event Received ??? S>> Тоесть в листбокс ничего не вижу???
M>В Event Registation надо добавить строку "MyEvent" и зарегистрировать. M>Можно добавить сразу несколько: M>aaa M>bbb M>ccc
M>После этого, вводим в Event какое-либо из зарегистрированных, нажимаем Generate Event и получаем его в Event Received. M>Послав незарегистрированное, в Event Received ничего и не получим.
Всё Окей. Но у меня опять процессор полсе каждой команды Refresh()
ресурсы много потребляет. А существует ли механизм передачи
последней записи таблицы, без Refresh() или без Locate().
Ведь позиционирование на последнюю запись со стороны клиента тоже
занимает время.
...
M>>После этого, вводим в Event какое-либо из зарегистрированных, нажимаем Generate Event и получаем его в Event Received. M>>Послав незарегистрированное, в Event Received ничего и не получим.
S>Всё Окей. Но у меня опять процессор полсе каждой команды Refresh() S>ресурсы много потребляет. А существует ли механизм передачи S>последней записи таблицы, без Refresh() или без Locate(). S>Ведь позиционирование на последнюю запись со стороны клиента тоже S>занимает время.
Честно говоря, как это сделать с использованием TxxTable и TxxDataGrid — не знаю.
TxxTable же не знает, какие записи изменились и добавились. Поэтому и перечитывает всё.
Поэтому, в подобных случаях обычно всё делаю руками. Например, с помощью TIBSQL и TListView.
Оно быстрее и проще выходит.
Механизм получения вставленных и/или изменённых записей я уже описывал — с помощью генераторов.
Re[12]: IB & быстрая вставка записей по TTimer
От:
Аноним
Дата:
02.12.03 23:55
Оценка:
Здравствуйте, mrhru, Вы писали:
M>Здравствуйте, solon, Вы писали:
M>...
M>>>После этого, вводим в Event какое-либо из зарегистрированных, нажимаем Generate Event и получаем его в Event Received. M>>>Послав незарегистрированное, в Event Received ничего и не получим.
S>>Всё Окей. Но у меня опять процессор полсе каждой команды Refresh() S>>ресурсы много потребляет. А существует ли механизм передачи S>>последней записи таблицы, без Refresh() или без Locate(). S>>Ведь позиционирование на последнюю запись со стороны клиента тоже S>>занимает время.
M> Честно говоря, как это сделать с использованием TxxTable и TxxDataGrid — не знаю. M>TxxTable же не знает, какие записи изменились и добавились. Поэтому и перечитывает всё.
M>Поэтому, в подобных случаях обычно всё делаю руками. Например, с помощью TIBSQL и TListView. M>Оно быстрее и проще выходит. M>Механизм получения вставленных и/или изменённых записей я уже описывал — с помощью генераторов.