IB & быстрая вставка записей по TTimer
От: solon  
Дата: 20.11.03 08:03
Оценка:
Привет!

Подскажите как можно по таймеру вставлять записи
в Interbase 7 + IBX .( примерно от 1 до 10-20 записей в секунду)?
У меня никак не сихронизируется с формой приложения.
Одиночно записи вставляются, но ка ктолько "сажу" все на таймер,
то получаю очень много записей на SQL сервере и они какието
обрезанные.
В чем проблема не пойму?


С Уважением, solon
Re: IB & быстрая вставка записей по TTimer
От: Romkin  
Дата: 20.11.03 10:26
Оценка:
Здравствуйте, solon, Вы писали:

S> Подскажите как можно по таймеру вставлять записи

S>в Interbase 7 + IBX .( примерно от 1 до 10-20 записей в секунду)?
S>У меня никак не сихронизируется с формой приложения.
S>Одиночно записи вставляются, но ка ктолько "сажу" все на таймер,
S>то получаю очень много записей на SQL сервере и они какието
S>обрезанные.
S>В чем проблема не пойму?

Ошибка в 17 строке
Re[2]: IB & быстрая вставка записей по TTimer
От: solon  
Дата: 24.11.03 01:08
Оценка:
Здравствуйте, Romkin, Вы писали:

R>Здравствуйте, solon, Вы писали:


S>> Подскажите как можно по таймеру вставлять записи

S>>в Interbase 7 + IBX .( примерно от 1 до 10-20 записей в секунду)?
S>>У меня никак не сихронизируется с формой приложения.
S>>Одиночно записи вставляются, но ка ктолько "сажу" все на таймер,
S>>то получаю очень много записей на SQL сервере и они какието
S>>обрезанные.
S>>В чем проблема не пойму?

R>Ошибка в 17 строке


А что означает "Ошибка в 17 строке" ???
Re[3]: IB & быстрая вставка записей по TTimer
От: mrhru Россия  
Дата: 24.11.03 01:54
Оценка:
Здравствуйте, 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>>>и они какието обрезанные.

Что значит обрезанные?
Re[4]: IB & быстрая вставка записей по TTimer
От: solon  
Дата: 24.11.03 08:00
Оценка:
Здравствуйте, mrhru, Вы писали:

Так много оверквотить вовсе не обязательно..

Ладно , дошло и до меня в чём проблема:
не туда оператор End вставил и цикл не там где надо был

Так что спасибо вам за "Ту-134"

Вот второй вопрос у меня серьезный:
Каким образом можно передать клиентам, что данные
в конкретной таблице Интербайс изменились. В старых
версиях Интербейс я делал просто
"отсоединение — присоединение". А теперича как?
Использую IBX:
На серверной части у меня крутиться приложение с компонентами
TIBDatabase;
TIBTransaction;
TIBStoredProc;
IBTable1: TIBTable;

С Уважением, solon,
Re[5]: IB & быстрая вставка записей по TTimer
От: mrhru Россия  
Дата: 24.11.03 08:14
Оценка:
Здравствуйте, 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.
Re[6]: IB & быстрая вставка записей по TTimer
От: solon  
Дата: 25.11.03 00:48
Оценка:
Здравствуйте, 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 процентов
да и плюс сетку тоже нагружает на тот случай когда запрашиваем
есть ли новые записи, а их пока нет.
МОЖЕТ ВСЕТАКИ НА САМОМ ИНТЕРБАЙСЕ ЕСТЬ ОПЦИЯ НАСТРАИВАЕМАЯ,
КОТОРАЯ ПОСЫЛАЕТ ОБНОВЛЕННЫЕ ДАННЫЕ ПОДСОЕДИНЕННЫМ КЛИЕНТАМ
(ОТКРЫТЫМ ТАБЛИЦАМ)???
Re[7]: IB & быстрая вставка записей по TTimer
От: mrhru Россия  
Дата: 25.11.03 01:48
Оценка:
Здравствуйте, 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 — требует аккуратности.
Re[8]: IB & быстрая вставка записей по TTimer
От: solon  
Дата: 26.11.03 03:25
Оценка:
Здравствуйте, 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 ???
Тоесть в листбокс ничего не вижу???
Re[9]: IB & быстрая вставка записей по TTimer
От: mrhru Россия  
Дата: 26.11.03 03:55
Оценка:
Здравствуйте, 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 ничего и не получим.
Re[10]: IB & быстрая вставка записей по TTimer
От: solon  
Дата: 26.11.03 08:21
Оценка:
Здравствуйте, 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().
Ведь позиционирование на последнюю запись со стороны клиента тоже
занимает время.
Re[11]: IB & быстрая вставка записей по TTimer
От: mrhru Россия  
Дата: 26.11.03 08:50
Оценка:
Здравствуйте, solon, Вы писали:

...

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>Механизм получения вставленных и/или изменённых записей я уже описывал — с помощью генераторов.

Благадарю за помощь!
С Уважением, solon
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.