|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
Всем доброго времени суток! Столкнулся с такой проблемой: происходит утечка памяти при вызове хранимых процедур в БД из 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.
Как выяснил экспериментальным путем, увеличение памяти процесса происходит на строчке: Код: plaintext
Если эту строчку закомментировать, то увеличения используемой памяти не происходит. Пытался "поиграться" с параметрами соединения с БД, но ничего явно влияющего на процесс обработки вызовов хранимых процедур БД, среди доступных параметров не нашел. Может, кто-то уже сталкивался с подобной проблемой? Это глюк PB или драйвера ODBC? Может, есть другой более качественный драйвер ODBC? Заранее спасибо за ответы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 18:27 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
Dmitry Golubev, А зачем вызывать хранимые процедуры в БД из PB через dynamic SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2010, 18:37 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
Ну как зачем? :) Нужно :) А именно, в системе сделана попытка отделения бизнес-логики от программного ядра, то есть вызовы хранимых процедур, которые реализуют часть бизнес-логики, описаны вовне кода PB, как строки, а код PB их просто обрабатывает, вызывая их динамически. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 12:42 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
Да, и важное дополнение: аргументы для хранимой процедуры заранее неизвестны, то есть они должны подставляться уже в рантайме. Поэтому - только Dynamic SQL... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 12:56 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
зачем так извращатся делаем враперы PB_PROC_CALL(DBProcName, param1, .. paramN) а уже из этой процдуры бегаем куда надо ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 14:15 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
Ну, на вкус и цвет, как грицца... По мне - так метод с заранее заданной процедурой как раз извращение... :) В смысле, что в данном случае получается привязка программного ядра к некоей реализации в БД. А хочется от этого совсем абстрагироваться... Вообще, Dynamic SQL Format 4 декларирован в PowerBuilder и нормально работает. Для курсоров - вообще никаких проблем. С хранимыми процедурами тоже работает, но вот что-то с памятью проблемы возникают... Я так подозреваю, что если память отжирается под процесс, связанный с моим приложением, то ODBC-драйвер здесь не причем, это глюк PB. Или есть другие мысли на этот счет? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 14:40 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
Dmitry GolubevНу, на вкус и цвет, как грицца... По мне - так метод с заранее заданной процедурой как раз извращение... :) В смысле, что в данном случае получается привязка программного ядра к некоей реализации в БД. А хочется от этого совсем абстрагироваться... Вообще, Dynamic SQL Format 4 декларирован в PowerBuilder и нормально работает. Для курсоров - вообще никаких проблем. С хранимыми процедурами тоже работает, но вот что-то с памятью проблемы возникают... Я так подозреваю, что если память отжирается под процесс, связанный с моим приложением, то ODBC-драйвер здесь не причем, это глюк PB. Или есть другие мысли на этот счет? ODBC драйвер работает в адресном пространстве приложения, так что не факт. Альтернативный вариант - динамически создавать DataWindows и потом вызывать его. Есть один нехороший момент - для определения ResultSet'а хранимая процедура при создании DataWindow будет запускаться с пустыми параметрами (это нужно предусмотреть в процедуре чтобы там ничего не творилось, но необходимый ResultSet возвращался). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 15:10 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
Локшин Марк, Спасибо за совет. Но боюсь, метод с DataWindow чреват большими накладными расходами: создание объекта и т.п.... В данном конкретном случае, вызов хранимой процедуры делается не для получения результ-сета, а для выполнения определенных действий в БД, без возвращения каких-либо данных. Проверяется лишь SQLCode операции. А выполнять процедуру нужно по-возможности быстро. К тому же таких вызовов может быть достаточно много за короткий промежуток времени. Подозреваю, что утечка памяти происходит где-то на стыке PB и ODBC при выполнении метода EXECUTE. Причем, скорее всего, особенность состоит в том, что это Dynamic SQL и аргументы процедуры передаются через область SQLDA... Они-то скорее всего и увеличивают память, то есть внутренние буфера не освобождаются. Но вот как их почистить, непонятно. В объекте DynamicDescriptionArea нет таких функций... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 16:06 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
DECLARE PROC DYNAMIC PROCEDURE FOR SQLSA; EXECUTE DYNAMIC PROC USING DESCRIPTOR SQLDA; Была подобная проблема с объявлением и выполнением процедур аналогичным способом (даже без DYNAMIC) - приложение тупо валилось периодически. Лечили формирование строки с командой типа "begin execute proc(....) end;" и дальше execute immediate :ls_sql; Понятно, что это меннее грамотно и увеличивает нагрузку на сервер (по крайней мере Oracle), но проблема ушла. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 16:39 |
|
Утечка памяти при вызове процедур в БД через ODBC (Firebird)
|
|||
---|---|---|---|
#18+
armblg, Спасибо за то, что навели на правильную мысль! Действительно, припоминаю, в более ранней версии приложения у нас делалось именно так - execute immediate и именно для Oracle! Затем, при миграции на Firebird было переделано на Dynamic SQL, уже не вспомню почему. Возможно, из соображений перфекционизма, так как вроде бы это эффективней :) А на поверку оказывается: лучшее - враг хорошего... В-общем, заменил я Dynamic SQL на простой Execute Immediate - и проблема исчезла! Так что, похоже, это глюк PB... Спасибо всем за участие! Надеюсь, данный топик поможет еще кому-нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2010, 18:10 |
|
|
start [/forum/topic.php?fid=15&fpage=26&tid=1335958]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 162ms |
0 / 0 |