Предпосылки использования хранимых процедур на языке Java




Скачать 60.71 Kb.
НазваниеПредпосылки использования хранимых процедур на языке Java
Дата публикации03.04.2013
Размер60.71 Kb.
ТипОбзор
odtdocs.ru > Информатика > Обзор

Содержание

Задание 2

Предпосылки использования хранимых процедур на языке Java 2

Принцип работы внешних процедур на языке Java 2

Утилита LOADJAVA 4



Задание


Обзор, разработка и использование хранимых процедур, написанных на языке Java в СУБД Oracle.

Предпосылки использования хранимых процедур на языке Java


Внешние процедуры на языке Java отличаются от процедур на C тем, что, как и программные единицы PL/SQL, они выполняются встроенной виртуальной Java-машиной (VM) сервера Oracle, непосредственно в адресном пространстве сервера. Чтобы использовать внешние процедуры на языке C, необходимо сконфигурировать процесс прослушивания, настроить файл TNSNAMES.ORA и запустить отдельный процесс. При использовании языка Java все это не нужно, поскольку как интерпретируемый язык он считается "безопасным" (как и PL/SQL). Тот факт, что работа происходит в одном адресном пространстве, обеспечивает более быстрое взаимодействие между кодом на Java и сервером, в частности происходит меньше переключений контекста между процессами на уровне ОС. С другой стороны, однако, Java-код всегда работает с правами "владельца ПО Oracle", поэтому хранимая процедура на Java (при наличии соответствующих привилегий) может переписать файл параметров инициализации сервера, INIT.ORA (или другие, еще более важные файлы, например файлы данных).

Даже не смотря на огромные возможности PS/SQL их порой не хватает. Ниже приведены примеры ситуаций когда использование хранимых процедур на языке Java является оправданным шагом:

  • Работа с сетью. PL/SQL не предоставляет возможность работы с сетевыми службами, поэтому использование хранимых процедур, написанных на языке Java является обоснованным и необходимым для решения поставленной задачи;

  • Недостающие функции для работы с ФС;

  • Выполнение системных вызовов.
^

Принцип работы внешних процедур на языке Java


Использование внешних(хранимых) процедур предполагает наличие следующих проблем, которые должны быть решены:

  • Управление состоянием. Внешние процедуры могут потерять информацию о состоянии (текущие значения статических или глобальных переменных). Это связано с используемым механизмом кеширования динамически подключаемых библиотек. Поэтому необходим механизм определения и сохранения состояния в программах на языке C;

  • Механизмы трассировки. Внешние процедуры выполняются на сервере как отдельный процесс. Хотя на некоторых платформах эти процедуры можно отлаживать с помощью обычного отладчика, это весьма сложно и, если ошибки возникают только при одновременном использовании внешней процедуры большим количеством пользователей, просто невозможно. Необходимо средство генерации трассировочных файлов по требованию, “начиная с этого момента”;

  • Использование параметров. Необходимо средство параметризации внешних процедур, чтобы можно было управлять их работой извне с помощью файла параметров, аналогично тому, как файл init.ora используется для управления сервером;

  • Общая обработка ошибок. Необходимо простое средство выдачи пользователю вразумительных сообщений об ошибках.

При использовании языка Java оказывается, что управление состоянием, трассировка и общая обработка ошибок уже не является проблемой. Для сохранения информации о состоянии достаточно объявить переменные в создаваемых Java-классах. Для обеспечения простейшей трассировки можно использовать вызовы System.out.println. Общую обработку ошибок можно выполнять с помощью функции RAISE_APPLICATION_ERROR языка PL/SQL. Все это продемонстрировано в следующем коде:

SQL> create or replace and compile

2 java source named "demo"

3 as

4 import java.sql.SQLException;

5

6 public class demo extends Object

7 {

8

9 static int counter = 0;

10

11 public static int IncrementCounter() throws SQLException

12 {

13 System.out.println("Entering IncrementCounter function, counter = "+counter);

14 if (++counter >= 3)

15 {

16 System.out.println("Error! counter="+counter);

17 #sql {

18 begin raise_application_error(-20001, 'Too many calls'); end;

19 };

20 }

21 System.out.println("Exiting IncrementCounter function, counter = "+counter);

22 return counter;

23 }

24 }

25 /

Java created.

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

Для создания небольших фрагментов кода вроде этого можно использовать утилиту SQL*Plus, непосредственно загружающую Java-код в базу данных, автоматически компилируя его в байт-код и запоминая в соответствующих структурах. Ни внешний компилятор, ни средства разработки JDK при этом не нужны — достаточно SQL-оператора CREATE OR REPLACE. Плюс такого подхода в том что это упрощает установку хранимых процедур на любой платформе и не нужно запрашивать имя пользователя и пароль как в случае с утилитой LOADJAVA, не надо думать о каталогах для поиска классов и других подобных нюансах.

^

Утилита LOADJAVA


Утилита loadjava является самостоятельным приложением, которе запускается в командной строке и используется для загрузки Java файлов в базу данных. При первом выполнении loadjava в схеме создаются несколько служебных объектов:

  • CREATE$JAVA$LOB$TABLE -- таблица, содержащая Java код;

  • JAVA$CLASS$MD5$TABLE -- хэш таблица, используемая для отслеживания изменений в загруженных классах;

  • LOADLOBS -- пакет, присутствующий в каждой схеме и используемый для загрузки Java-кода как больших объектов(large objects(LOBs)).



Используя LOADLOBS, loadjava загружает Java файлы в BLOB поле таблицы CREATE$JAVA$LOB$TABLE. Так же, проверяется хэш JAVA$CLASS$MD5$TABLE.MD5 для того чтобы определить -- были ли загружаемые классы загружены ранее и были ли они изменены для минимизации количества загружаемых данных. После этого происходит вызов команды DDL -- CREATE JAVA для загрузки Java классов из BLOB-поля таблицы CREATE$JAVA$LOB$TABLE в RDBMS как объекта схемы. Загрузка выполняется только при следующих условиях:

  • Класс загружается в первый раз;

  • Класс был изменён;

  • Указан параметр “-force”.



Синтаксис утилиты:

loadjava {-user | -u} username/password [ @database] [ -option_name [ -option_name ] ...] filename [ filename ]...
где option_name имеет следующий синтаксис:

{ {andresolve | a} | debug | {definer | d} | {encoding | e} encoding_scheme_name | {force | f} | {grant | g} {username | role_name}[,{username | role_name}]... | {oci8 | o} | oracleresolver | {resolve | r} | {resolver | R} "resolver_spec" | {schema | S} schema_name | {synonym | s} | {thin | t} | {verbose | v} }
В качестве Java-файлов могут быть использованы файлы исходных кодов, файлы ресурсов, скомпилированные классы, SQLJ-файлы, .jar файлы и .zip файлы, указанные в любом порядке.
Например, следующая команда загружает класс JFile в схему SCOTT:

loadjava -user scott/tiger -oci8 -resolve JFile.class
В таблице ниже приведен список всех опций утилиты с описанием.

Опция

Описание

-andresolve

Скомпилировать исходные файлы и разрешить каждый файл класса по мере загрузки. Эта опция взаимоисключающая с опцией -resolve. Если ни одна из них указана, файлы загружаются но не компилируются и не разрешаются. Этот режим не рекомендуется использовать, поскольку классы с неразрешёнными зависимостями могут остаться помеченными как валидные, что вызовет ошибку во время исполнения.

-debug

Генерировать отладочную информацию.

-definer

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

-encoding

Кодировка файлов.

-force

Принудительная загрузка файлов не смотря на то, были они загружены ранее или нет. Нельзя форсировать загрузку .class файла, если перед этим был загружен .java файл. Для этого надо спервы выполнить выгрузку .java файла.

-grant

Предоставить права на исполнение пользователям, указанным в списке.

-oci8

Использовать драйвер OCI JDBC для взаимодействия с базой данных. Этот параметр включен по-умолчанию.

-resolve

После того как все файлы загружены и, при необходимости, скомпилированы -- произвести разрешение зависимостей пакетов. Если эта опция не указана, файлы загружаются, но не компилируются и зависимости не разрешаются до момента исполнения.

-schema

Присваевать созданные объекты указанной схеме.

-synonym

Создаёт публичный синоним(алиас) загружаемым классам, делая их доступными вне схемы, в которую они загружены.

-thin

Использовать драйвер JDBC для взимодействия с базой данных.

-verbose

Включит вывод статусных сообщений в консоль.


В качестве примера напишем класс, содержащий метод, который возвращает строку. Код класса приведен ниже:

public class DemoClass extends Object

{

public static String GiveMeAString ()

{

System.out.println("Asked for a string");

return "A String";

}

}
Класс хранится в файле с именем DemoClass.java. Для загрузки класса в схему test воспользуемся утилитой loadjava:

loadjava -u test/test DemoClass.java
После того как загрузка выполнена можно создавать описание функции:

SQL> create or replace function JavaFunction return varchar2

2 as language java

3 name 'DemoClass.GiveMeAString() return java.lang.String';

4 /
Function created.
Так же заведём переменную, в которую запишем значение, возвращаемое функцией:

SQL> var returnedValue varchar2(100);
Теперь можно производить вызов процедуры:

SQL> call JavaFunction() into :returnedValue;
Call completed.
SQL> print returnedValue;
RETURNEDVALUE

-----------------------------------------------------------------------------

A String


Добавить документ в свой блог или на сайт

Похожие:

Лабораторная работа №4 по курсу «тфкп» на тему: «Типы данных, переменные,...
Изучить типы данных, правила объявления переменных, констант и массивов в языке Java. Научиться создавать программы на языке Java,...

Лабораторная работа №4 по курсу «тфкп» на тему: «Типы данных, переменные,...
Изучить типы данных, правила объявления переменных, констант и массивов в языке Java. Научиться создавать программы на языке Java,...

Лабораторная работа №4 по курсу «тфкп» на тему: «Типы данных, переменные,...
Изучить типы данных, правила объявления переменных, констант и массивов в языке Java. Научиться создавать программы на языке Java,...

Учебное пособие Москва 2008
По для объектно-ориентированного программирования и разработки приложений на языке Java

Стандарт разработки приложений на языке Java
Данный документ распространяется на условиях Лицензии свободной документации gnu (gnu fdl), Версия 3

Лабораторная работа №3 по курсу «тфя» на тему: «Взаимодействие с базами данных»
Изучить приемы работы с базами данных, предоставляемые разработчику в языке Java

Лабораторная работа №2 по курсу «тфя» на тему: «Взаимодействие с базами данных»
Изучить приемы и средства работы с базами данных, предоставляемые разработчику в языке Java

Лабораторная работа №3 по курсу «тфя» на тему: «Взаимодействие с базами данных»
Изучить приемы и средства работы с базами данных, предоставляемые разработчику в языке Java

Лабораторная работа №2 по курсу «тфя» на тему: «Взаимодействие с базами данных»
Изучить приемы и средства работы с базами данных, предоставляемые разработчику в языке Java

Лабораторная работа №2 по курсу «тфя» на тему: «Взаимодействие с базами данных»
Изучить приемы и средства работы с базами данных, предоставляемые разработчику в языке Java

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
odtdocs.ru
Главная страница