Форум: "Базы";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
ВнизTIBQuery и Out of Memory (help) Найти похожие ветки
← →
A_Gura (2002-12-16 06:27) [0]Люди!!!! В чем проблема???
Использую IBX TIBQuery. Из файла читаю запись, проверяю ее наличие в БД (запрос на выборку), если запись отсутствует - вставляю ее в БД (insert).
Записей много!!!
Короче при выполнении запроса на выборку большое кол-во раз (более 2000) вываливается ошибка Out of Memory. Сразу добавлю: я сам память не выделяю (т.е. это не моя ошибка)...
← →
Andriano (2002-12-16 07:47) [1]Ты по ним по всем пробегаешь, для того чтобы найти?
Почему ошибка не знаю, но можно сделать проще.
Сделай хранимую проц. Ей передавай в качестве параметров, поля новой записи, а она, проверив наличие такой записи, добавит или игнорирует её.
Определять количество записей нужно select count(Уникальное_Значение) from Таблица_1, т.е. ещё одна процедура.
← →
A_Gura (2002-12-16 09:04) [2]Хранимая процедура не покатит... У меня выгрузка БД в XML (перемещается по области)... Таблица в базе не одна, а на каждую хранимую процедуру делать сам понимаешь...
А насчет моего вопроса: добавил строчкуIBQuery.Params.Clear;
стало больше записей съедать... Не знаю что и делать, може т вообще компонент динамический создавать...
← →
Sergey Masloff (2002-12-16 09:09) [3]Напиши поподробнее что и как ты там вставляешь.
Кстати, вот пример процедуры для IB которая делает Insert или Update в звыисимости от наличия записи
---------------------------------------------------------
CREATE PROCEDURE INSERT_OR_UPDATE_MY_TABLE (
P_ID INTEGER,
P_FIELD1 NUMERIC(15,4),
P_FIELD2 VARCHAR(10),
......
P_REMARK VARCHAR(255))
AS
DECLARE VARIABLE V_K INTEGER;
begin
V_K = NULL;
FOR SELECT ISN FROM MY_TABLE
WHERE ID=:P_ID
INTO :V_K
AS CURSOR TMPCURSOR
DO
UPDATE MY_TABLE M
SET
ID = :P_ID,
FIELD1 = :P_FIELD1,
FIELD2 = :P_FIELD2,
...........
WHERE CURRENT OF TMPCURSOR;
IF (V_K IS NULL) THEN
INSERT INTO MY_TABLE(ID,
FIELD1,
FIELD2,
...
)
VALUES(:P_ID,
:P_FIELD1,
:P_FIELD2,
....
);
end
------------------------------------------------------
← →
A_Gura (2002-12-16 09:24) [4]Я уже сказал, что хранимые процедуры не покатят (см. пред. ответы)...
Отгрузка базы у меня хранится в XML-документе, в этом же документе описана структура (список таблиц, поля в них, с указанием того, какие ключевые, а какие нет). Последовательно читаю записи. Для каждой формирую запрос на выборку (т.е. запрос с параметрами, где параметры содержат значения ключевых полей).
Далее, если запрос возвращает запись, то переходим к следующей, иначе формируем запрос на вставку новой записи, выполняем его, и переходим к следующей... Повторюсь: записей много - несколько тысяч.
← →
Max Zyuzin (2002-12-16 09:35) [5]А код посмотреть можно??
← →
Sergey Masloff (2002-12-16 09:43) [6]A_Gura
Ну я чего-то не понимаю. Ну у меня тоже есть загрузка из XML. Непонятно почему не подходят ХП? И несколько тысяч-это совсем немного записей.
ХП может вставлять и в несколько таблиц, да и непонятно в чем проблема написать один раз несколько ХП?
Зато смотри: с ХП тебе не нужно проверять наличие записи в таблице. Просто гонишь свой XML до конца, а ХП сама проверяет - есть или нет такая записю. Причем это делает на порядок быстрее чем ты своим динамически сформированным XML.
Кстати, пример немного не в тему. У меня была выгрузка базы в XML средствами клиента на Delphi. Потом я переделал ее на ХП. выгрузка которая шла 3-7 минут стала выполняться мгновенно (я даже не мерял, ну может 2-3 секунды максимум)/
← →
A_Gura (2002-12-16 10:01) [7]Мылом ушло
← →
A_Gura (2002-12-16 10:06) [8]Насчет ХП. Я полностью согласен что будет быстрее. Но, во-первых, такая процедура (т.е. код) универсальна. Во-вторых, это уже дело принципа, хочу понять в чем проблема.
← →
Max Zyuzin (2002-12-16 10:31) [9]>A_Gura (16.12.02 10:01)
Спасибо, конечно... я имел ввиду сюда в форум :)
← →
A_Gura (2002-12-16 10:32) [10]Сюда не входит :)
Всегда пожалуйста ;)
← →
Johnmen (2002-12-16 10:55) [11]Похоже проблема в утечке памяти при использовании TIBQuery.
Хотя лично я не сталкивался, т.к. не пользую TIBQuery для получения НД. Попробуй проапдейтить IBX. Возможно багов будет меньше.
← →
A_Gura (2002-12-16 11:03) [12]Установлена версия IBX 6.04... В 6.05 вроде только поддержка ib7 добавлена.
← →
A_Gura (2002-12-17 14:29) [13]Один человек говорит, что заметил эту ошибку почти 2 года назад... Ну и как теперь с ней бороться... Надо очень срочно... Работа стоит.
← →
Johnmen (2002-12-17 14:44) [14]Проведи эксперимент :
1) В рамках одной транзакции получаешь НД, используя TIBDataSet
2) В рамках других делаешь вставки, причем с каждый раз с подтверждением тр-ии...
Каков результат ?
← →
A_Gura (2002-12-17 14:51) [15]Дык прикол в том, что глюк вываливается во время запросов на выборку, а не вставки. Вставка работает превосходно.
← →
Max Zyuzin (2002-12-17 14:54) [16]Попробуй ради эксперимента делать выборки в другой транзакции... И после выборок RollBack делать ей...
← →
A_Gura (2002-12-17 14:59) [17]Не пойму зачем. Чего ты от этого эксперимента ожидаешь?
← →
Max Zyuzin (2002-12-17 15:00) [18]Что бы было меньше телодвижений в рамках транзакции...
← →
Johnmen (2002-12-17 15:02) [19]1)StartTransaction
2)Получить НД
3)Поработать с НД
4)Закрыть НД
5)Commit
И что ?
← →
A_Gura (2002-12-17 15:07) [20]Попробую... Но если это утечка памяти у TIBQuery, то можно попробовть его динамический создавать и по завершении транзакции уничтожать. Мне кажется должно помочь.
← →
Max Zyuzin (2002-12-17 15:17) [21]>A_Gura (17.12.02 15:07)
Думаю, что так будет еще хуже...
>Johnmen © (17.12.02 15:02)
Если это мне :) то просто мне любезно прислали кусок кода :)) там транзакции завершаются после пары сотен вставок открываний :)
Я понимаю, что это не так уж и много, но мало ли что...
← →
Max Zyuzin (2002-12-17 15:24) [22]>A_Gura (17.12.02 15:07)
И еще в догонку... попробуй делать не CommitRetaining а просто Commit может тут какие "хвосты" остаются... (и соответственно Rollback)
← →
Johnmen (2002-12-17 15:29) [23]>Max Zyuzin © (17.12.02 15:17)
Нет. Это автору про первую тр-ю... :-)
>A_Gura (17.12.02 15:07)
Попробуй...Но, думаю, не поможет...
← →
A_Gura (2002-12-25 06:22) [24]При динамическом создании и уничтожении TIBQuery, все работает... Ура!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c