суббота, 2 октября 2010 г.

Один сценарий ODI - одна сессия в СУБД Oracle.

Предыдущий пост, посвященный получению в переменную ODI результата выполнения некоторой PL/SQL процедуры через значение переменной модуля(Oracle package) натолкнул меня на мысль проверить, как этот механизм будет работать при одновременном выполнении нескольких сценариев.

Если исходить с точки зрения того, как механизм использования модулей реализован в СУБД Oracle, то получалось, что, в случае выделения каждому сценарию своей собственной сессии, для каждого сценария мы будем иметь отдельную область памяти, в которую конкретизируется (instantiated) модуль, и, таким образом, в каждом модуле мы получим свое значение переменной.

Для проверки этой гипотезы, я создал пакет ODI, в котором использовал процедуру ODI, описанную в предыдущем сообщении, возвращающую наименование сессии ODI в переменную #TestFunc. Вот как он выглядит:


Порядок выполнения:
  1. Вызов процедуры, создающей модуль P$_TEMP, тело модуля P$_TEMP и сохраняющий в переменную модуля pv_ret значение '<%=odiRef.getSession( "SESS_NAME" )%>'.
  2. Получение случайного значения в промежутке от 0 до 10000 в переменную #VariableN для выполнения задержки.
  3. Задержка выполнения.
  4. Получение значения из переменной pv_ret модуля P$_TEMP в переменную ODI #TestFunc
  5. Вывод полученного значения с помощью RaiseException процедуры.
Из этого пакета был сгенерирован сценарий, который вызывался в цикле несколько раз из запускающего пакета:


В результате получился запуск 21 сценария, каждый из которых вернул правильное значение переменной #TestFunc через процедуру RaiseException:


Пока все выглядит так, что использование общей переменной из модуля Oracle двумя и более одновременно выполняющимися сценариями будет возвращать корректный результат. Но для того, чтобы окончательно убедиться в этом, я модифицировал начальный пакет так, чтобы в переменную #TestFunc получить значение SID СУБД Oracle и вывести его в Операторе.

select sys_context('USERENV','SID') from dual

Это будет прямая проверка того, что агент ODI для запуска каждого отдельного сценария использует отдельные сессии:


Порядок выполнения.
  1. Делаем случайную задержку.
  2. Получаем SID сессии
  3. Выводим результат.

Результат после запуска модифицированного пакета как в виде сценария (цикл из 21 запуска) так и в виде пакета, в общем-то, был предсказуемым. Т.е. номера SID для разных пакетов в период выполнения этих пакетов (или сценариев) не повторялись.

Отсюда можно сделать вывод, что использовать модули Oracle для передачи значений из процедур PL/SQL в переменные ODI, можно даже при одновременном запуске нескольких сценариев.

Комментариев нет:

Отправить комментарий