![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вставка данных в 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