Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

Вставка данных в Interbase   Найти похожие ветки 

 
Submarine   (2004-12-09 07:42) [0]

Использую компоненты с закладки 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 07:49) [1]

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


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

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


 
Zacho ©   (2004-12-09 08:10) [3]

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

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


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

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


 
Zacho ©   (2004-12-09 08:22) [5]

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:30) [6]

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


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

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


 
Zacho ©   (2004-12-09 09:15) [8]

Submarine   (09.12.04 8:52) [7]

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


 
Submarine   (2004-12-09 09:25) [9]

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


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

Submarine   (09.12.04 9:25) [9]

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


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

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


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

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


 
Zacho ©   (2004-12-09 10:38) [13]

Submarine   (09.12.04 10:26) [11]

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


 
Sergey13 ©   (2004-12-09 10:48) [14]

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


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

Не, не так...
Вроде получилось.... код вставки следующий:
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-ре поля....


 
Submarine   (2004-12-09 12:03) [16]

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

end;


 
Sergey13 ©   (2004-12-09 12:05) [17]

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


 
Sergey13 ©   (2004-12-09 12:07) [18]

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


 
Zacho ©   (2004-12-09 12:21) [19]

Submarine   (09.12.04 11:59) [15]

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.01.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
14-1103705307
vidiv
2004-12-22 11:48
2005.01.09
Переходник IDE для ноутбука


14-1103363351
Чеширский_Кот
2004-12-18 12:49
2005.01.09
Сегодня намечается нехилая заруба


4-1101195343
Sik
2004-11-23 10:35
2005.01.09
Электронная цифровая подпись


14-1103616384
Vasya.ru
2004-12-21 11:06
2005.01.09
regedit не запускается


14-1103470093
mrX
2004-12-19 18:28
2005.01.09
Вопрос по мат. анализу