Текущий архив: 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