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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
4-62928
Cobalt
2002-12-02 17:10
2003.01.20
Взаимная блокировка окон


1-62604
Senator
2003-01-09 12:10
2003.01.20
мерцание


4-62923
Uncle Archi
2002-12-03 21:25
2003.01.20
Win API


6-62692
Dmitriy Polskoy
2002-11-20 17:58
2003.01.20
ClientSocketRead


14-62793
ПИТОН
2002-12-31 06:56
2003.01.20
Новый Год