Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 CURRENT TIMESTAMP в UDF  [new]
aserdjuk
Member

Откуда:
Сообщений: 32
Добрый день, коллеги.

Быть может, кто-то сталкивался с проблемой :
есть sql user defined function UDF1, возвращаюшая таблицу.

Функция вызывает sql stored procedure PROC1, которая оперирует переменными timestamp,
получая значения из регистра CURRENT TIMESTAMP.

Проблема заключается в том, что в процедуре PROC1 значение CURRENT TIMESTAMP не меняется в ходе выполнения
при вызове из функции UDF1 и прекрасно меняется при вызове процедуры PROC1 напрямую.

Есть ли метод обойти это наследование c помощью настроек БД или DDL UDF1 или PROC1 ?

Приложение, к сожалению, не может вызвать PROC1.
11 апр 13, 09:58    [14165426]     Ответить | Цитировать Сообщить модератору
 Re: CURRENT TIMESTAMP в UDF  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
aserdjuk,

Добрый день.

+ Вроде изменяется...
create or replace procedure test_timestamp(out a timestamp, out b timestamp)
reads sql data
begin
set a = (select max(current timestamp) from syscat.tables, syscat.tables);
set b = (select max(current timestamp) from syscat.tables, syscat.tables);
end@

create or replace function test_timestamp()
returns table (a timestamp, b timestamp)
begin atomic
declare a, b timestamp;
call test_timestamp(a, b);
return
select a, b from sysibm.sysdummy1;
end@

call test_timestamp(?, ?)@


Value of output parameters
--------------------------
Parameter Name : A
Parameter Value : 2013-04-11-11.33.43.267000

Parameter Name : B
Parameter Value : 2013-04-11-11.33.43.352000

select * from table(test_timestamp())@


A B
-------------------------- --------------------------
2013-04-11-11.34.14.692000 2013-04-11-11.34.14.774000

Если хочется, чтобы всегда изменялось, используйте вместо current timestamp:
timestamp(generate_unique()) + current timezone
11 апр 13, 11:41    [14166096]     Ответить | Цитировать Сообщить модератору
 Re: CURRENT TIMESTAMP в UDF  [new]
aserdjuk
Member

Откуда:
Сообщений: 32
Mark Barinstein,

большое спасибо, помогло и отпустило.

Дабы не затевать новую тему, спрошу тут.
Есть проблема в нескольких разновидных приложений, вызывающих процедуру P1. Процедура пишет данные в таблицу и ждет ответа от обработчика.
Обработчик (бин на WAS 8) вызывает select field from table( UDF1() ); получая записи для обработки, обрабатывает их и записывает результат в ту же таблицу.

Т.к. требования к скорости достаточно жесткие, пытаюсь минимизировать таймауты этой конструкции.
UDF1 оптимизирована, данные партиционированы и т.д.
Уменьшение интервала сканирования обработчикам нагружает cpu&io, убивает event monitoring.

Пробовал dbms_alert и dbms_pipe, но время между send и receive у них порядка 500-700 мс.
Пробовал soap wrapper, дополнительные расходы около 1 секунды.

Нет ли еще какой-либо альтернативы для быстрого обмена между различными приложениями с помощью функций и процедур
в db2 9.7FP8 @aix ?

Исключить общение приложений через db2, к сожалению, не получится.
11 апр 13, 12:16    [14166379]     Ответить | Цитировать Сообщить модератору
 Re: CURRENT TIMESTAMP в UDF  [new]
CawaSPb
Member

Откуда: Питер/Москва/Wroclaw
Сообщений: 1091
aserdjuk,

А почему бы не кидать нотификации через те же пайпы/другие средства IPC, используя DB2 как брокер (списки подписчиков, прочая информация).
Нет возможности заморачиваться всем этим в приложении, писать соответствующие внешние ф-и/процедуры.
11 апр 13, 14:16    [14167171]     Ответить | Цитировать Сообщить модератору
 Re: CURRENT TIMESTAMP в UDF  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
aserdjuk
Исключить общение приложений через db2, к сожалению, не получится.

Тут бы подробнее в чем именно "затык" и какое ПО доступно для использования.
Можно конечно поиграться с блокировкой/разблокировкой пустой отдельной таблицы, когда факт разблокировки будет служить сигналом начало обработки, но это криво по сути.
Откуда растет требование синхронизации действий приложений через СУБД?
Можно например написать хранимую (java), которая будет "дергать" EJB/MDB-компонент на WAS и возвращать результаты.
Можно из DB2 общаться с IBM WebSphere MQ, можно дергать сервис через SOAP и получать ответ.

Желательно видеть постановку задачи более полно, чтобы сформулировать варианты решения. И понимать что в этой постановке можно менять, а что трудно и/или невозможно. Если будет понятен "поток" обработки, т.е. кто кому и что передает, и в какой последовательности обрабатывает, можно будет что-то предложить по вариантам реализации.
11 апр 13, 14:42    [14167373]     Ответить | Цитировать Сообщить модератору
 Re: CURRENT TIMESTAMP в UDF  [new]
aserdjuk
Member

Откуда:
Сообщений: 32
Евгений Хабаров,
CawaSPb


Трудностей только три, два лиричных и одна практическая :
проект большой и команда инерционна,
приоритетами является функциональное развитие, а не технологическое усовершенствование,
несколько legacy потребителей, которые, в силу своего возраста, знать ничего не знают об mq, soap и rmi.

Пока, насколько понимаю, самый практичный вариант это замена SQL процедур и функций на JAVA.
Для вызова WAS с db2 понадобится WAS client ?

http://pic.dhe.ibm.com/infocenter/pim/v6r0m0/index.jsp?topic=/com.ibm.wpc.ins.doc/wpc_tsk_setting_up_ibm_db2_on_the_app_server.html
11 апр 13, 16:58    [14168487]     Ответить | Цитировать Сообщить модератору
 Re: CURRENT TIMESTAMP в UDF  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
aserdjuk
Евгений Хабаров,
CawaSPb


Трудностей только три, два лиричных и одна практическая :
проект большой и команда инерционна,
приоритетами является функциональное развитие, а не технологическое усовершенствование,
несколько legacy потребителей, которые, в силу своего возраста, знать ничего не знают об mq, soap и rmi.

Пока, насколько понимаю, самый практичный вариант это замена SQL процедур и функций на JAVA.
Для вызова WAS с db2 понадобится WAS client ?

http://pic.dhe.ibm.com/infocenter/pim/v6r0m0/index.jsp?topic=/com.ibm.wpc.ins.doc/wpc_tsk_setting_up_ibm_db2_on_the_app_server.html

Вариантов много. Попытаюсь изложить то, что навскидку пришло в голову.
Основная идея ( с учетом того, что поток обработки я пока не представляю) чтобы доступ к WAS(EJB) шел по более-менее короткому пути.
Т.е. вызываем процедуру и передаем ей (или формируем внутри нее) выборку, подлежащую обработке.
После чего этот массив данных неким образом (скорее всего как XML) передается на обработку серверу приложений (WAS)
Суть хранимой:
- Сформировать выборку и представить ее в виде XML. По сути это один или несколько SQL-запросов.
- Вызвать EJB-компонент или веб-сервис и получить от него ответ.
- Разобрать ответный XML-документ и выполнить модификацию таблиц.

Варианты:
1. Если рядом есть сервер WebSphere MQ, то задействовать MQSeries routines.
Отправка асинхронная, прием без ожидания. Нужно будет разобраться с настройкой тракта передачи и форматом сообщений. Для приема на стороне WAS достаточно написать весьма несложный MDB, который будет слушать очередь и принимать сообщения.
Если рядом MQ нет, можно написать хранимую на Java и использовать Thin Client for JMS для доступа к встроенной службе сообщений WAS.
Это все в случае, если нужна асинхронная обработка. Т.е. в этом случае отправка запроса и чтение ответа "распадаются" на разные транзакции.
Со стороны DB2 - нужна настройка для взаимодействия с MQ штатных хранимых/функций, или написание собственной хранимой/функции.
Со стороны WAS - написание компонент(ы) отвечающей за прием и обработку сообщений.

2. Если есть лицензия на IBM InfoSphere Federation Server, можно задействовать Web service consumer functions со стороны СУБД и дописать/оформить EJB для работы в качестве веб-сервиса.
Со стороны DB2 в этом случае настройка минимальна, со стороны WAS - реализация веб-сервиса.
Если лицензии нет, то написать Java-хранимую, которая будет обращаться к веб-сервису. Тут даже тонкий клиент может не понадобиться, тк функционал для работы с веб-сервисами разных стандартов либо встроен в JDK (зависит от версии JDK), либо доступен в виде внешних библиотек. Можно задействовать и тонкие клиенты для WAS для JAX-WS и JAX-RPC.
Со стороны DB2 в этом случае ннаписать хранимую/функцию, со стороны WAS - реализация веб-сервиса.

3. Можно задействовать Thin Client for EJB для прямого обращения к EJB.
Со стороны СУБД - хранимая на Java. Со стороны WAS - возможно ничего.

4. Можно со стороны WAS написать простейший сервлет (который, возможно, вызывает EJB), который будет принимать на входе например JSON (или XML) и на выход аналогично отдавать JSON или XML. На самом деле реализовать веб-сервис (в современных условиях) почти не сложнее, чем сервлет. Посмотрите в сторону JAX-RS. Так что этот пункт считать не рекомендуемым, а просто как доп. вариант.

Надеюсь, что схема взаимодействия компонент в существующем виде есть? И чего хочется достичь тоже есть?
В графическом представлении рисовать и анализировать потоки обработки информации все же удобнее.
Если нет, рекомендую такую схему нарисовать (для себя и коллег), возможно обнаружатся другие варианты(точки) взаимодействия.

PS: Это все, что могу придумать навскидку. До понедельника я буду далеко от интернета, поэтому дискуссию смогу продолжить только в понедельник.
11 апр 13, 22:47    [14170016]     Ответить | Цитировать Сообщить модератору
 Re: CURRENT TIMESTAMP в UDF  [new]
aserdjuk
Member

Откуда:
Сообщений: 32
Евгений Хабаров

3. Можно задействовать Thin Client for EJB для прямого обращения к EJB.
Со стороны СУБД - хранимая на Java. Со стороны WAS - возможно ничего.



Спасибо большое ! П.3. я как раз и реализовывал как самый логичный.
Схем, графов и прочих накладных расходов у нас много :)
12 апр 13, 11:05    [14171467]     Ответить | Цитировать Сообщить модератору
 Re: CURRENT TIMESTAMP в UDF  [new]
aserdjuk
Member

Откуда:
Сообщений: 32
Кстати, посмотрел исходный текст syscat.routines для WAITONE из DBMS_.
Тоже самое цикличное сканирование таблицы SYSTOOLS.DBMS_ALERT_INF с поеданием cpu & io.
Только, в отличии от меня, PREPARE стоит в цикле :(
12 апр 13, 13:39    [14172585]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить