среда, 30 мая 2007 г.

Развертывание приложений Apex : часть 1 (Export)

Как правило, процесс разработки ПО идет по следующему сценарию: Разработка (development) -> Тестирование (testing) -> Заказчик (deploy). То есть, в начале разрабатывается приложение в соответствии с заявленными требованиями, потом выполняется проверка на соответствие этим требованиям и заключительным этапом является развертывание приложения на стороне заказчика. При этом, на втором и третьем этапе необходимо развернуть приложение на новой площадке (для чистоты эксперимента). В Oracle Application Express этот процесс максимально автоматизирован (чему, в основном, способствует именно архитектура Apex - когда, вся информация о приложении хранится в БД).

Суть процесса хорошо описана в документации и заключатеся в том, что Apex позволяет экспортировать всю необходимую информацию о приложении в файл и, соответственно, есть возможность импорта этого файла. Сам файл представляется из себя простой текст с DML операциями.

Для того, чтобы экспортировать приложение, необходимо перейти в приложение и выбрать "Export/Import"->"Export"->"Application":

start to export apex application

После чего, появится диалог экспорта приложения:

set apex application export settings
Где:


  • Application - идентификатор и название экспортируемого приложения

  • File Format - тип форматирования строк в файле: DOS/UNIX style

  • Owner Override - пользователь, для которого будет в дальнешем импортировано приложение. Если не указано, то текущий

  • Build Status Override - статус приложения после дальнейшего импорта. "Run Application Only" - приложение можно только запускать на выполнение. "Run and Build Application" - приложение можно как выполнять, так и дорабатывать

  • Debugging - возможность использования встроенной отладки после дальнейшего импорта приложения

  • Export Supporting Object Definitions - необходимость включаения в файл экспорта определения объектов БД, которые используются в приложении

  • Export Comments - необходимость экспорта комментариев

  • As of - экспорт приложения по состоянию на указанное количество минут назад (используется функциональность пакета DBMS_FLASHBACK)

  • File Character Set - кодировка, в которой выполняется экспорт

Результатом будет sql-файл, который можно проимпортировать на другой площадке.
О том, как выполнять импорт файла приложения и о возможных "непонятках", которые могут возникнуть в процессе импорта, будет рассказано в одной из следующих заметок...

Подробнее...

суббота, 26 мая 2007 г.

Повышаем производительность (часть 3)

Заканчиваем перевод статьи Sizing Up Performance, начатый в постах "Повышаем производительность (часть 1)" и "Повышаем производительность (часть 2)".

Оптимизация элементов страниц
Другими общедоступными возможностями настройки производительности приложений Oracle Appliccation Express являются такие элементы, как процессы(Page processes), вычисления(computations),авторизация(authorizations), валидация(validations) и условия (conditions). Производительность этих элементов на странице должна быть очевидной при работе приложения в режиме отладки (debug mode). Ниже приведены рекомендации для этих элементов страницы:

Устанавливайте момент запуска процесса на уровне страницы (page processes) - один на страницу (per-page), а не на сессию. Если же используется процесс на уровне приложения (application-level processes) , то можно установить момент запуска - один на сессию (per session) или на показ страницы (page view). Имейте в виду, что использование опции по сессионного старта процесса уровня приложения, может повлиять на отображение всех страниц приложения.

Оптимизируйте составляющие нулевой страницы (особенности этой страницы описаны здесь). Компоненты этой страницы отображаются на каждой странице приложения, поэтому стоит уделить особое внимание оптимизации логики именно этой страницы. Объединяйте различные PL/SQL блоки в пакеты, то есть, если на странице есть большие PL/SQL блоки, то лучше перенести эти блоки в PL/SQL пакет и вызывать его из приложения.

Используйте декларативные условия. Такия условия быстрее, чем динамический SQL или PL/SQL-условия. Например, использование условие типа "Item=Value" будет быстрее, чем использование PL/SQL-выражения ":ITEM=value."

Для отчетов, содержащих большое количество строк, лучше использовать нумерацию страниц типа "Rows X to Y". Нумерация типа "Rows X to Y of Z" занимает больше времени на выполнение, чем простая нумерация типа "Rows X to Y". Например, если в отчете, содержащем 900 строк, используется нумерация типа "Rows X to Y of Z", Oracle Application Express будет должен выполнить полную выборку данных, чтобы установить количество строк. А при использовании нумерации типа "Rows X to Y", будет необходимо выбрать только Y + 1 строку.

Выводы

Использование представленного материала, поможет оценить производительность и масштабируемость приложений Oracle Application Express. Если производительность приложения оставляет желать лучшего, то использование выше представленных подсказок поможет установить самые медленные страницы и определить на них плохо реализованные компоненты. Используя данную информацию, можно будет гарантировать, что ваши приложения Oracle Application Express будут соответствовать заявленным требованиям по производительности.

Подробнее...

среда, 23 мая 2007 г.

Повышаем производительность (часть 2)

Продолжаем перевод статьи Sizing Up Performance о проблемах производительности в приложениях Oracle Application Express, начатый в предыдущем посте.

Поиск и устранение узких мест
Накладные расходы, связанные с созданием страницы в Apex, довольно статичны. Время потраченное на обработку SQL или PL/SQL кода, созданного разработчком, добавляется к тому, которое было использовано для генерации страницы. Используя "Monitor Activity", можно легко определить наихудшие по производительности страницы приложений:

Monitor Activity feature of Oracle Application Express

После того, как определена самая медленная страница приложения, можно изучить ее в режиме отладки, нажав ссылку "Debug" в панели инструментов разработчика.

Debug link in the Oracle Application Express Developer Toolbar

В режиме отладки, отдновременно с выводом самой страницы, выводится и информация о затраченном на вывод времени: отражаются временные интервалы, соответствующие конкретным действиям Oracle Application Express, а так же такая дополнительная информация, как названия элементов страницы, вычисления, точки обработки.

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

.
.
.
0.05: Region: Projects
0.06: Show report
0.06: Determine column headings
0.06: Activate sort
0.07: Parse query as: MIKE1
0.07: Binding: ":P24_SEARCH"="P24_SEARCH" value=""
0.07: Print column headings
0.07: Rows loop: 15 row(s)
0.18: Region: Icon View
.
.
.

Очевиден скачек потраченного времени с 0.07 секунд до 0.18. Этот скачок свидетельствует о том, что запрос занимает 0.11 секунд на выполнение, которое в данном примере имеет значительную долю в общем времени вывода страницы и, таким образом, является отличной целью для оптимизации.

Настройка SQL
Наиболее распространенной областью настройки является SQL. Движок Oracle Application Express выполняет разбор, связывание, непосредственное выполнение и получение результирующих данных SQL-запросов отчетов. Использование связанных переменных (bind variables) везде, где это возможно, избавляет от ненужного разбора и способствует повторному использованию планов SQL-запросов.

Кроме того, необходимо убедиться, что для запроса используется оптимальный план. Для генерации плана запроса можно использовать "Explain Plan" в окне "SQL Commands".

Для более тщательного изучения каждого фрагмента SQL или PL/SQL кода на каждой странице, можно включить для нее SQL-трассировку. SQL-трассировка сгенерирует трейс файл на серевере, который можно будет проанализировать Oracle утилитой - TKPROF. (более подробную информацию об использовании TKPROF в Oracle Application Express можно найти в разделе Debugging an Application в "Oracle Application Express User's Guide")
(прим. автора - подробнее о связываемых переменных, планах выполнения, жестком/мягком разборе запросов и трассировке можно почитать в книге Т.Кайта "Oracle для проффесионалов").

... продолжение следует ...

Подробнее...

суббота, 19 мая 2007 г.

Повышаем производительность (часть 1)

Листал на днях Oracle Magazine, и наткнулся на давольно интересную статью про оценку прозводительности приложений Apex. После беглого просмотра обратился к русской редакции данного журнала и, к своему удивлению, обнаружил, что перевода ее нет :(. После недолгих раздумий решил исправить положение :)...

Советы и методы для оптимальной производительности Oracle Application Express
В силу того, что Oracle Application Express становится все более популярным, все больше пользователей ищут руководства по настройке производительности для Apex приложений. Ниже будет продемострирован быстрый и удобный способ для оценки и изменения производительности. Так же будет продемонстрировано, как идентифицировать и решать проблемы производительности. Ниже перечислены наиболее общие вопросы, которые будут освещены:


  • Какое количество оборудования, особенно сколько процессоров (CPU), будет необходимо для работы с заданной нагрузкой

  • Какое количество пользователей будет поддерживать приложение

  • Как локализовать узкие места в производительности


Понимание понятия "производительность" в приложениях Oracle Application Express
Ключ к оптимальной производительности для большинства приложений Oracle Application Express заключается в том, чтобы сохранять среднее время отображения страницы относительно небольшим. Масштабирование линейно: приложение со среднем временем вывода страницы в 10 милисекунд может быть вызвано в 10 раз больше конкурирующими пользователями, чем приложение со среднем временем вывода страницы в 100 милисекунд.
Для беглой оценки производительности приложений Apex, можно использовать статистику собранную Apex'ом, информация о которой доступна на странице "Monitor Activity". Если предположить, что приложение хорошо оптимизировано, включая эффективный SQL и PL/SQL, то самым важным изменяемым фактором является количество процессоров (CPU).
Например, предположим, что разрабатывается приложение, которое должно обеспечивать 1000 показов страниц в минуту. Для системы с двумя процессорами, приложение должно обеспечивать 500 показов страниц в минуту на один процессор или 8.33 показа в секунду/процессор. Для того, чтобы удовлетворить этим требованиям, необходимо, чтобы среднее время вывода страницы не превышало 120 милисекунд.
Отношение между доступным числом процессоров и требуемым числом показов страниц в минуту, выраженное в среднем времени отклика на страницу, может быть отражено с помощью следующей формулы:

(N*60)
------ = A
P

, где:

  • N - количество процессоров

  • P - количество показов страниц в минуту

  • A - среднее время отклика на страницу


Используя это простое уравнение, можно выполнять оценку среднего времени отображения страницы для обеспечения заданного числа показов страниц в минуту. Изменяя число процессоров или количество показов страниц в минуту, можно установить четкие целевые показатели для приложения.
Кроме того, среднее время отображения страницы может помочь в предсказании влияния изменения размера пользователей, то есть, для того, чтобы определить количество пользователей, которое может обеспечивать приложение, начиная с первого определения количества запросов страниц в течение определенного периода времени.
Например, если средняя сессия, включающая 50 показов страниц, занимает 10 минут,а приложение поддерживает отображение пяти страниц в минуту для обычной сессии, то если приложение масштабируется для обеспечения 1000 показов страниц в минуту, то приложение будет поддерживать 200 одновременных пользователей на сессию.
Если экстраполировать эти данные для оценки количества ежедневных пользователей, то давайте так же считать, что все пользователи находятся в одном часовом поясе и, что в среднем каждый пользователь использует две сессии в один восьмичасовой рабочий день, в результате чего имеем 100 страниц (2 * 50 страниц в сессии). Поскольку приложение масштабируется на 1000 показов страниц в минуту,то умножим число минут в восьми часах (480) на страницы в минуту (1000), чтобы определить, что приложение может обеспечивать 480000 показов страниц на каждые восемь часов, или 4800 пользователей.
Как правило, приложение необходимо масштабировать для самого загруженного часа, так как нагрузка может быть 100 страниц в минуту в течение дня, а может быть и 1000 просмотров страниц в минуту в час пик.
Другое правило состоит в том, что необходимо обеспечивать среднее время показа страницы 300 милисекунд или менее. Для высоко производительных приложений, с многими сотнями или тысячи пользователей, необходимо стремиться к среднему времени показа страницы 150 милисекунд или менее.

... продолжение следует...

Подробнее...

вторник, 15 мая 2007 г.

Отчеты по Apex в SQL Developer

В одной из последних версий SQL Developer были добавлены несколько отчетов для Application Express. Таким образом, теперь есть возможность просматривать некоторую информацию об Apex приложениях прямо из IDE (хотя доступ к ней был и раньше, так как всегда были общедоступные взгляды APEX_%, но теперь не надо будет писать даже запросов :).

sqldeveloper apex reports

Однако, доступ к функциональности будет только с версии Apex 3.0.1, а пока будем получать:
sqldeveloper message about apex version

Но, по слухам, осталось ждать не долго :)... поговаривают, что уже в конце мая-начале июня должен появиться новый патч для Apex.

Подробнее...

суббота, 12 мая 2007 г.

Установка значений Apex переменных (session state) из PL/SQL кода

Как уже было продемонстрировано в ряде примеров, а так же не плохо описано в документации, в Oracle Application Express установка/получение значения переменнной сессии выполняется следующим образом:


:PN_ITEM_NAME := 'item_value'; -- установка значения
:PNN_ITEM_NAME := :PN_ITEM_NAME; -- установка и чтение значения


Однако в коде хранимых процедур такой подход не допустим. Как же в таком случае получить или установить значение Apex-переменной их хранимого на сервере PL/SQL кода? Все очень просто:

  • для чтения значения переменной необходимо использовать синтаксис - v('PN_ITEM_NAME')
  • для установки значения переменной необходимо пользоваться методом пакета APEX_UTIL:

    ...
    APEX_UTIL.set_session_state(
    p_name => ‘PN_ITEM_NAME’,
    p_value => ‘item_value’);
    ...


Вот так вот, не смотря на подробнейшую документацию, все таки остаются темные пятна :).

Подробнее...

вторник, 8 мая 2007 г.

Firefox + Firebug = Apex IDE

Если вы занимаетесь разработкой Web-приложений (в том числе и Oracle Application Express), то Вам просто необходимо знать о существовании такого расширения для Firefox'a как FireBug . Это расширение из разряда "must have", так как предоставляет все основные функции, необходимые для отладки приложений (и даже больше :).

Вот лишь часть функций:


  • отладка JavaScript (точки останова, просмотр значения переменных, стэк и т.д. )

  • анализ CSS

  • анализ HTML

  • анализ DOM

  • монитор сетевой активности

и т.д.
Скачать можно как с сайта Mozilla.org, так и с домашней страницы проекта - getfirebug.com, где так же можно найти описание основных функций.

Подробнее...

суббота, 5 мая 2007 г.

Подсветка выбранной строки в отчетах Apex.

В состав Oracle Application Express входит ряд шаблонов для отчетов, но, к сожалению, ни одни из них не предоставляет функциональности подсветки выбранной строки. Оказывается исправить эту несправедливость не так уж и сложно... Для этого достаточно лишь немного скорректировать шаблон отчета. Что такое шаблон отчета и зачем он нужен хорошо описано в документации по Apex.

Итак, заходим в репозитарий шаблонов apex приложения, расположенный в "Shared Components"->"User Interface"->"Templates":
apex application report templates
Далее, создаем точную копию любого шаблона (копию делаем для того, чтобы в отчетах, которые уже используют этот шаблон не изменили своего поведения). В наше случае возьмем за основу стандартный шаблон отчета:
apex report remplates
Даем название для нового шаблона - "Standard (highlight row)".
apex naming for new report template
Далее, переходим к редактированию нового шаблона:
edit apex report templateПереходим к блоку "Column Templates" шаблона, где предоставляется возможность использовать все свои знания HTML :).
Добавляем в блоке "Column Template 1" строку " style="background-color:#CCCCCC" ", чтобы обозначит цвет фона для конкретной строки отчета. Далее, необходимо описать условия, при которых строка будет иметь указанный цвет фона. Для этого, в блоке "Column Template 1 Condition" выбираем значение "Use Based on PL/SQL Expression", а в блоке "Column Template 1 Expression" прописываем: " '#OBJECT_TYPE#' = :P1_TYPE ". Таким образом, у строки отчета будет отличный цвет фона только в том случае, если значение в колонке OBJECT_TYPE совпадает со значением, прописанным в невидимом поле P1_TYPE (происхождение и назначение этого поля можно узнать из этого топика про Master-Detail):
apex report template propertyКроме всего прочего, в блоке "Column Template 2" прописываем стандартное значение. Этот шаблон будет применяться для всех тех строк отчета, для которых не отработал первый шаблон. Далее, очищаем поле "Background color for checked row", так как цвет фона мы уже прописали в первом шаблоне, а так же в поле "Background color for current row" прописываем значение "#EEEEEE", тем самым отчет будет подсвечивать строку, над которой сейчас находится указатель мыши пользователя:

set current row color in apex report templateДалее, переходим к описанию отчета, для которого хотим применить новый шаблон:

choose report to apply new teplate in apex application
Переходим в блок "Layout and Pagination" в выпадающем списке "Report Template" выбираем название ранее созданного шаблона - "template: 17. Standard (highlight row)":
set new template for report in apexВот и все дела... Работу описанного выше приложения можно, как всегда, посмотреть на apex.oracle.com.

Подробнее...

вторник, 1 мая 2007 г.

Добавляем поиск и подсветку в отчет Oracle Application Express.

Зачастую в приложениях, работающих со значительными объемами данных, необходим такой функционал как поиск. К сожалению, Oracle Application Express не предоставляет таких встроенных средств (как, например, Oracle Forms). Поэтому его (функционал поиска) необходимо реализовывать в ручную.
Продолжая развивать созданное ранее приложение, добавим к нему возможность поиска и подсветки результатов. Для этого необходимо зайти в главную страницу приложения и добавить регион, в котором будут содержаться элементы интерфейса для работы с поиском:
Добавляем простой HTML-регион:


Выставляем заголовок для региона - "Поиск" и номер последовательности выбираем такой, чтобы номера всех остальных регионов приложения были больше. Таким образом, мы сообщаем Apex'у о том, что создаваемый регион необходимо выводить на странице самым первым:
Источник оставляем пустым:
В результате, видим новый регион:
Следующим шагом будет добавление непосредственно строки поиска и кнопки обновления страницы. Добавляем строку поиска - это будет новый Item:
Тип элемента - простое текстовое поле:
Указываем имя элементу и регион, к которому он будет относиться:
Далее, указываем заголовок строки поиска:
И выставляем источник элемента - "не вычисляемый":
Далее, необходимо добавить кнопку, которая будет сообщать приложению о необходимости обновить страницу с учетом введенной строки поиска:
Указываем, к какому региону будет принадлежать новый элемент интерфейса:
Указываем, что кнопка должна располагаться внутри региона, а не за его пределами:
Указываем наименование новой кнопки, текст, который будет выведен на ней и шаблон, в соответствии с которым сам контрол будет выводиться на странице:
Далее, добавим подсказку для строки поиска, для этого необходимо перейти к описанию соответствующего элемента интерфейса:
Перейти в секцию "Help" и ввести текст подсказки:
Далее, необходимо изменить регион отчета таким образом, чтобы он учитывал строку поиска. Для этого необходимо перейти к описанию региона:
И в секции "Source" изменить текст запроса:
Далее, необходимо указать приложению на какую страницу необходимо навигироваться после нажатия кнопки поиска. Для этого необходимо создать новый "Branch":
Указываем, что будем переходить на страницу:
Указываем номер страницы:
Кроме того, указываем, что переходить нужно только в том случае, если была нажата кнопка поиска:
И, завершающим штрихом, добавляем подсветку результатов поиска. Для этого переходим в описание отчета:
Переходим к описанию того поля, по которому будет выполняться поиск:
И указываем в поле "Highlight Words" наименование того поля, в соответствии со значением которого, необходимо выполнять подсветку:
Вот и все...
Работу приложения, как всегда можно проверить на apex.oracle.com.

Подробнее...