Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
4-62891
Igor45
2002-12-02 13:22
2003.01.20
Sol.exe must die!!!


1-62587
Maksss
2003-01-08 08:00
2003.01.20
не доходит до адресата sendmessage !!!!!!


14-62797
Сатир
2002-12-30 15:55
2003.01.20
Новый форум


3-62434
KonuhovSegey
2002-12-26 07:08
2003.01.20
Автоинкрементные поля в Paradox по сети.


14-62724
Хмырь
2002-12-30 20:04
2003.01.20
Люди!!! Спасайте!!! Провокация!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский