powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Утечка памяти при вызове процедур в БД через ODBC (Firebird)
11 сообщений из 11, страница 1 из 1
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36616017
Dmitry Golubev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток!

Столкнулся с такой проблемой: происходит утечка памяти при вызове хранимых процедур в БД из PB. Версия PB - 11.5.1.4011. Работаю с БД Firebird через драйвер ODBC. Версия Firebird - 2.1.218118. Версия драйвера FB ODBC (IBPhoenix Open Source) - 2.00.00.148.

Код в PB примерно вот такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	// Подготовка процедуры к выполнению
	PREPARE SQLSA FROM :is_sql USING SQLCA;
	DESCRIBE SQLSA INTO SQLDA;
	// Установка входных параметров
	for n =  1  to SQLDA.NumInputs
		SetDynamicParm(SQLDA, n, ia_value)
	next
	// Выполнение процедуры
	DECLARE PROC DYNAMIC PROCEDURE FOR SQLSA;
	EXECUTE DYNAMIC PROC USING DESCRIPTOR SQLDA;
	CLOSE PROC;

Как выяснил экспериментальным путем, увеличение памяти процесса происходит на строчке:

Код: plaintext
	EXECUTE DYNAMIC PROC USING DESCRIPTOR SQLDA;

Если эту строчку закомментировать, то увеличения используемой памяти не происходит.

Пытался "поиграться" с параметрами соединения с БД, но ничего явно влияющего на процесс обработки вызовов хранимых процедур БД, среди доступных параметров не нашел.

Может, кто-то уже сталкивался с подобной проблемой? Это глюк PB или драйвера ODBC? Может, есть другой более качественный драйвер ODBC?

Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36616035
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Golubev,

А зачем вызывать хранимые процедуры в БД из PB через dynamic SQL?
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36617145
Dmitry Golubev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну как зачем? :) Нужно :)

А именно, в системе сделана попытка отделения бизнес-логики от программного ядра, то есть вызовы хранимых процедур, которые реализуют часть бизнес-логики, описаны вовне кода PB, как строки, а код PB их просто обрабатывает, вызывая их динамически.
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36617179
Dmitry Golubev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и важное дополнение: аргументы для хранимой процедуры заранее неизвестны, то есть они должны подставляться уже в рантайме. Поэтому - только Dynamic SQL...
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36617399
ono ?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
зачем так извращатся
делаем враперы
PB_PROC_CALL(DBProcName, param1, .. paramN)
а уже из этой процдуры бегаем куда надо
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36617484
Dmitry Golubev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, на вкус и цвет, как грицца... По мне - так метод с заранее заданной процедурой как раз извращение... :)

В смысле, что в данном случае получается привязка программного ядра к некоей реализации в БД. А хочется от этого совсем абстрагироваться...

Вообще, Dynamic SQL Format 4 декларирован в PowerBuilder и нормально работает. Для курсоров - вообще никаких проблем. С хранимыми процедурами тоже работает, но вот что-то с памятью проблемы возникают... Я так подозреваю, что если память отжирается под процесс, связанный с моим приложением, то ODBC-драйвер здесь не причем, это глюк PB. Или есть другие мысли на этот счет?
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36617616
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry GolubevНу, на вкус и цвет, как грицца... По мне - так метод с заранее заданной процедурой как раз извращение... :)

В смысле, что в данном случае получается привязка программного ядра к некоей реализации в БД. А хочется от этого совсем абстрагироваться...

Вообще, Dynamic SQL Format 4 декларирован в PowerBuilder и нормально работает. Для курсоров - вообще никаких проблем. С хранимыми процедурами тоже работает, но вот что-то с памятью проблемы возникают... Я так подозреваю, что если память отжирается под процесс, связанный с моим приложением, то ODBC-драйвер здесь не причем, это глюк PB. Или есть другие мысли на этот счет?
ODBC драйвер работает в адресном пространстве приложения, так что не факт.
Альтернативный вариант - динамически создавать DataWindows и потом вызывать его. Есть один нехороший момент - для определения ResultSet'а хранимая процедура при создании DataWindow будет запускаться с пустыми параметрами (это нужно предусмотреть в процедуре чтобы там ничего не творилось, но необходимый ResultSet возвращался).
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36617779
Dmitry Golubev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин Марк,

Спасибо за совет. Но боюсь, метод с DataWindow чреват большими накладными расходами: создание объекта и т.п....

В данном конкретном случае, вызов хранимой процедуры делается не для получения результ-сета, а для выполнения определенных действий в БД, без возвращения каких-либо данных. Проверяется лишь SQLCode операции. А выполнять процедуру нужно по-возможности быстро. К тому же таких вызовов может быть достаточно много за короткий промежуток времени.

Подозреваю, что утечка памяти происходит где-то на стыке PB и ODBC при выполнении метода EXECUTE. Причем, скорее всего, особенность состоит в том, что это Dynamic SQL и аргументы процедуры передаются через область SQLDA... Они-то скорее всего и увеличивают память, то есть внутренние буфера не освобождаются. Но вот как их почистить, непонятно. В объекте DynamicDescriptionArea нет таких функций...
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36617872
armblg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DECLARE PROC DYNAMIC PROCEDURE FOR SQLSA;
EXECUTE DYNAMIC PROC USING DESCRIPTOR SQLDA;
Была подобная проблема с объявлением и выполнением процедур аналогичным способом (даже без DYNAMIC) - приложение тупо валилось периодически. Лечили формирование строки с командой типа "begin execute proc(....) end;" и дальше execute immediate :ls_sql;
Понятно, что это меннее грамотно и увеличивает нагрузку на сервер (по крайней мере Oracle), но проблема ушла.
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36618011
Dmitry Golubev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
armblg,

Спасибо за то, что навели на правильную мысль! Действительно, припоминаю, в более ранней версии приложения у нас делалось именно так - execute immediate и именно для Oracle! Затем, при миграции на Firebird было переделано на Dynamic SQL, уже не вспомню почему. Возможно, из соображений перфекционизма, так как вроде бы это эффективней :) А на поверку оказывается: лучшее - враг хорошего...

В-общем, заменил я Dynamic SQL на простой Execute Immediate - и проблема исчезла! Так что, похоже, это глюк PB...

Спасибо всем за участие! Надеюсь, данный топик поможет еще кому-нибудь.
...
Рейтинг: 0 / 0
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
    #36618019
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Golubev
В-общем, заменил я Dynamic SQL на простой Execute Immediate - и проблема исчезла!

Вот и ответ на мой вопрос :-)))
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Утечка памяти при вызове процедур в БД через ODBC (Firebird)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]