Выделение памяти в UDF

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Dmitriy_S
Сообщения: 4
Зарегистрирован: 03 июл 2007, 20:22

Выделение памяти в UDF

Сообщение Dmitriy_S » 03 июл 2007, 20:43

В BLOB поле хранится XML-ка. Есть функция udf-ки, которая определяет, попадает ли содержимое блоба под заданный фильтр. Фильтр так же передается как блоб. На данный момент не нравится то, что фильтр каждый раз парсится заново при очередном вызове функции. Хочется, чтобы один раз в udf-ке он распарсился, куда-нибудь сохранился и лежал бы там, пока его принудительно не освободят. Собственно, вопрос - можно ли выделить память в udf-ке, передать наружу в хранимую процедуру указатель, который потом использовать при дальнейших вызовах в рамках отработки этой процедуры?

PS: faq и поиск уже курил...

IB 7.5, UDF - Visual C++

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 июл 2007, 23:30

можно, но никто не гарантирует, что в одном треде к переменной обратятся два или больше коннектов. В рамках одной процедуры может и прокатит.

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 04 июл 2007, 09:56

Может имеет смысл сделать что-то вроеде кэша для распарсенных фильтров? Наличие в кэше проверять хэшем :). Кэш фиксированного размера с вытеснением. А то ведь можно и не дождаться принудительного освобождения... А так универсальная функция -- вызывай откуда хочешь без оглядки на порядок вызова.
С указателем или хэндлом можно пролететь, мало ли что за время после вызова функции распарсивания произошло. Сильно зависит от поведения сервера.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Выделение памяти в UDF

Сообщение WildSery » 04 июл 2007, 12:00

Dmitriy_S писал(а):Хочется, чтобы один раз в udf-ке он распарсился, куда-нибудь сохранился и лежал бы там, пока его принудительно не освободят.
Может, немного "не в кассу", но всё же.
Почему бы не парсить фильтры при их создании/изменении, и хранить вместе с нераспарсенными, а в UDF передавать уже распарсеный (типа как BLR для PSQL)?

Dmitriy_S
Сообщения: 4
Зарегистрирован: 03 июл 2007, 20:22

Сообщение Dmitriy_S » 05 июл 2007, 14:39

kdv писал(а):можно, но никто не гарантирует, что в одном треде к переменной обратятся два или больше коннектов. В рамках одной процедуры может и прокатит.
Да собственно, очевидно, как и предлагал Slavik, надо будет ваять хэш-мэп. А известно ли в какой момент подгружается dll udf-ки, а самое главное, когда она выгружается?

2 WildSery, вряд ли такое получится, потому что для XPath должна быть задействована стандартная библиотека, а вызов идет через jdbc.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 июл 2007, 01:18

А известно ли в какой момент подгружается dll udf-ки, а самое главное, когда она выгружается?
подгружается - в момент первого обращения к udf.
выгружается - в момент закрытия последнего коннекта, который обращался к udf.

p.s. xpath есть в виде udf на ibase.ru

Dmitriy_S
Сообщения: 4
Зарегистрирован: 03 июл 2007, 20:22

Сообщение Dmitriy_S » 09 июл 2007, 12:28

kdv писал(а): подгружается - в момент первого обращения к udf.
выгружается - в момент закрытия последнего коннекта, который обращался к udf.
О, спасибо!
kdv писал(а): p.s. xpath есть в виде udf на ibase.ru
Мне кажется более разумным xalan прикрутить.

Ответить