Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вставка данных в Interbase [D7, IB6.x]


Submarine ©   (2004-12-09 07:42:00) 

Использую компоненты с закладки Interbase, и использую след. код
procedure TForm1.Web_cam1AfterPost(DataSet: TDataSet);
begin
 try
 Video_base.ApplyUpdates([Web_cam1]);
 IBTransaction1.Commit;
   except
   ShowMessage('Не удалось сохранить изменения в базе данных!');
   Web_cam1.CancelUpdates;
   end;
end;
Где Video_base -IBDatabase, а Web_cam1 -IBquery....
Втавка происходит круглосуточно 1 раз в 2сек. Возникает 2 косяка
1)Происходит рост файла подкачки (через 6 часов увеличивается в 3 раза)
2) Почему-то вставка со временем происходит не раз в 2 сек, а увеличиваеться (1 всиавка раз в 18 сек.)
Как правильнее организовать втавку данных в БД...


Zacho   (2004-12-09 12:21:00) [1]

Submarine   (09.12.04 11:59) [15]

IBSQL1.Prepare; - здесь действительно лишний. Препаре надо сделать один раз, потом только присваивать новые значения параметрам запроса.

Commit делать, естественно, обязательно, после каждого инсерта, или после нескольких - сам смотри, как тебе надо.


Sergey13   (2004-12-09 12:07:00) [2]

2[16] Submarine   (09.12.04 12:03)
Насколько я понимаю - это не вставка, а фиксация вставки.


Sergey13   (2004-12-09 12:05:00) [3]

2[15] Submarine   (09.12.04 11:59)
IBSQL1.Prepare;
вроде тутлишний.


Submarine   (2004-12-09 12:03:00) [4]

>>Sergey13 ©  
До этого втавка данных осущестлялось  так
procedure TForm1.Web_cam1AfterPost(DataSet: TDataSet);
begin
 try
 Video_base.ApplyUpdates([Web_cam1]);
 IBTransaction1.Commit; // его я потом использовал, думал, что поможет..., непомогло
   except
   ShowMessage('Не удалось сохранить изменения в базе данных!');
   Web_cam1.CancelUpdates;
         end;

end;


Submarine   (2004-12-09 11:59:00) [5]

Не, не так...
Вроде получилось.... код вставки следующий:
MemStream := TMemoryStream.Create;
      IBSQL1.Prepare;
      ibsql1.ParamByName('DATE_REC').Value:=Time;
             ImageEnIO1.SaveToStreamJpeg(MemStream);
          MemStream.Seek(0, 0);
          ibsql1.ParamByName('VIDEO_PICTURE').LoadFromStream(MemStream);
          ibsql1.ParamByName('VIDEO_PICTURE1').LoadFromStream(MemStream);
          ibsql1.ParamByName('VIDEO_PICTURE2').LoadFromStream(MemStream);
          ibsql1.ParamByName('VIDEO_PICTURE3').LoadFromStream(MemStream);
          ibsql1.ExecQuery;
                 MemStream.Clear;
Т.к. идет режим отладки и проверки поэтому одну и ту-же каритнку загоняю в 4 поля, потом соответственно 4 разные картинки в 4-ре поля....


Sergey13   (2004-12-09 10:48:00) [6]

2Submarine
А как ты собственно пишешь в базу? Случайно не Video_base.Append [Insert]?


Zacho   (2004-12-09 10:38:00) [7]

Submarine   (09.12.04 10:26) [11]

Похоже, какой-то датасет у тебя постоянно растет. А при дисконнекте он закрывается, соответственно освобождается память, занимаемая его кэшем записей. Смотри в этом направлении. Т.к. TIBSQL не потомок TDataSet и не имеет кэша записей, то это явно не он.


Sergey13   (2004-12-09 10:32:00) [8]

А если попробовать вставку "завернуть" в ХП?


Submarine   (2004-12-09 10:26:00) [9]

Да, используя Task Manager, вижу что программа все больше и больше кушает память... причем она с 7 Мб увеличелась уже до 40 Мб (судя по показаниям Task Manager), буду искать в чем дело, где утечка, но все больше и больше подозрений, что все таки все дело с не корректной вставкой в БД..., т.к. при когда делаю дисконект,  конект, все нормализуеться.


Zacho   (2004-12-09 09:46:00) [10]

Submarine   (09.12.04 9:25) [9]

Ориентируйся не по размеру свопа, а посмотри сколько занимает в памяти твоя программа (хотя бы Task Manager'ом) и насколько увеличивается занимаемая ей память со временем.
Если выясниться, что виновата программа - ищи в ней утечки памяти. Возможно, они и не связаны с IBX.


Submarine   (2004-12-09 09:25:00) [11]

У меня сервер и клиент -один комп, и жрет память как раз программа по вставке записей в БД, медленно но верно, она сжирает где-то 1МБ за 20 минут, проверяеться очень просто, при остановке программы (при ее закрытии), своп-файл уменьшаеться до определенной величины.Но точные результаты могу сказать наверно, где-то часа через 2-3 работы программы(что-бы удостовериться наверняка).


Zacho   (2004-12-09 09:15:00) [12]

Submarine   (09.12.04 8:52) [7]

Своп на сервере или на клиенте ? Если сервер и клиент - один комп, посмотри, что именно жрёт память.


Submarine   (2004-12-09 08:52:00) [13]

Блин... проблема не решилась, своп- файл попрежнему растет.... А еще есть мысли как организовать ? :(


Submarine   (2004-12-09 08:30:00) [14]

Да, точно, код то то простой, что-то у меня голова уже совсем не варит.....
Огромное тебе спасибо, Zacho © !!!!
Сейчас попробую....


Zacho   (2004-12-09 08:22:00) [15]

Submarine   (09.12.04 8:06) [2]

В IBSQL.SQL пишешь запрос вида INSERT INTO MY_TABLE (FIELD_1, .., FIELD_N) VALUES (:VAL_1,.., :VAL_N)
Делаешь IBSQL.Prepare
Когда надо вставить очередную запись присваиваешь значения параметрам запроса (IBSQL.ParamByName('VAL_1').Value:=...) и делаешь IBSQL.ExecQuery


Submarine   (2004-12-09 08:18:00) [16]

Спасибо, это-то я понял. Я просто никогда не работал с компонентом TIBSQL, и  у меня нет под рукой книги где я могу посмотреть как с помощью него организовать вставку записей в БД...Если можно простой примерчик или описание в трех словах..


Zacho   (2004-12-09 08:10:00) [17]

Подробнее объясню, в чём твоя проблема:

У компонент, наследников TDataSet ( и TIBQuery в том числе) есть буфер для хранения набора данных. Когда ты делаешь IBQuery.Insert происходит вставка записи в этот буфер, при ApplyUpdates - выполняется запрос INSERT INTO ... и происходит вставка в БД добавленных в IBQuery записей, но из буфера IBQuery они никуда не исчезают. Потом ты вставляешь ещё запись .. За 6 часов - 10800 записей .. И все они оказываются в буфере IBQuery..
Естественно, что через некоторое время у тебя кончается свободня физическая память, начинается работа со своп-файлом, тормоза и т.д.


Submarine   (2004-12-09 08:06:00) [18]

Не совсем представляю как с ним работать.....Можно хотя бы в общих чертах, что то типа
TIBSQL.insert
TIBSQL.post или как правильно использовать ....


Zacho   (2004-12-09 07:49:00) [19]

Вместо TIBQuery используй TIBSQL


Наверх

Титульная страница Поиск, карта сайта Написать письмо