СТАТЬЯ |
07.02.03
|
© Владимир
Пржиялковский,
координатор Евро-Азиатской Группы Пользователей Oracle,
преподаватель УКЦ Interface
Ltd.
Содержание
Начиная с версии 8.1 в состав СУБД Oracle можно дополнительно включать так называемый JServer, позволяющий использовать для хранимых процедур помимо PL/SQL еще и язык Java. В состав JServer входят следующие элементы:
JVM Aurora способна исполнять методы Java ("хранимые Java-процедуры") и классы, хранимые в Oracle.
В версии 9.0 JServer переименован в Oracle9i JVM (иногда - OJVM или же Enterprise Java Server).
Наличие встроенной виртуальной машины Java в Oracle -дополнительная возможность по отношению к базовой поставке.
Начиная с версии 9.2 встроенная в СУБД виртуальная машина Java не поддерживает магазины протоколов J2EE и CORBA. В частности, с этого времени нет возможности разместить в БД под управлением Oracle контейнеры для EJB, JSP и сервлетов (OSE), как это было раньше. Их предлагается размещать в среде OC4J из состава Oracle 9i Application Server. Встроенная машина Java продолжает поддерживать только работу хранимых процедур, JDBC и SQLJ.
Java в Oracle представляет собой полнофункциональную замкнутую систему, однако классы Java средствами Oracle можно "публиковать" для PL/SQL-машины и вызывать из программ на PL/SQL.
Вплоть до версии 9.2 включительно PL/SQL в Oracle несравнимо эффективнее отрабатывает SQL-запросы. С другой стороны Java обладает более богатой и универсальной языковой средой для описания приложений.
Архитектура и принципы работы Java резко отличаются от архитектуры и принципов работы PL/SQL. Ниже излагаются некоторые особенности Java, существенные для использования этого языка при работе с Oracle.
Основными программными компонентами в среде разработки на Java являются исходный
код, класс, пакет, интерфейс, файл ресурсов. Взаимоотношение показано на рисунке.
Пакет используется для логический группировки программных единиц Java.
Архив используется для физической группировки программных единиц Java, необходимых для работы конкретной Java-программы, могущих быть вызваных прямо или по цепочке. Технологически часто единственная альтернатива неимоверному числу .class-файлов.
Для ведения разработок с использованием Java необходимо установить на компьютере JDK (Java Development Kit, прежнее название - SDK, Software Development Kit for Java).
Начиная с версии Oracle 8.1 JDK присутствует на CD с основной поставкой и может устанавливаться штатной программой Oracle Installer путем специального указания. В типовых вариантах установки программной среды Oracle (например, в вариантах Typical или Minimal в версиии 8.1) JDK появляется на компьютере автоматически.
JDK можно установить и независимо от Oracle, переписав этот программный комплект с http://www.javasoft.com/products/.
Для работы программ среды разработки Java должны быть выставлены следующие минимально необходимые переменные среды окружения ОС:
Исполняемые модули из состава JDK в версии 8.1 расположены в %ORACLE_HOME%\apache\jdk\bin, а в версии 9 - в %ORACLE_HOME%\ jdk\bin.
Основные библиотеки классов classes111.zip и classes12.zip (разница между ними - в версиях Java) в обеих версиях Oracle находятся в %ORACLE_HOME%\jdbc\lib
Для проведения экспериментов удобно создать командный файл со следующим текстом для версии Oracle 8.1:
set nls_lang=american_america.ru8pc866
set oracle_home=c:\oracle\ora81
set classpath=%oracle_home%\jdbc\lib\classes111.zip;.
path=%path%;%oracle_home%\apache\jdk\bin;%oracle_home%\lib
или со следующим текстом для версии Oracle 9.2:
set nls_lang=american_america.ru8pc866
set oracle_home=c:\oracle\ora92
set classpath=%oracle_home%\jdbc\lib\classes111.zip;.
path=%path%;%oracle_home%\jdk\bin
Теперь можно открыть консольное окошко и прогнать нужный командный файл.
Файл с программой под названием MyJavaAgent.java может иметь следующее содержание:
public
class MyJavaAgent { public static String sayHello (String toWhom) { return "Hello, " + toWhom + "!"; } public static void main(String[] args) { System.out.println(sayHello("World")); } } |
Транслирование программы (класса):
javac MyJavaAgent.java
Запуск программы (класса):
java MyJavaAgent
Oracle позволяет хранить Java-программы и вызывать их на исполнение с помощью встроенной JVM, полностью наподобие хранимым PL/SQL-процедурам, исполняемым встроенной PL/SQL-машиной.
Для работы с хранимыми Java-программами посредством Jserver/OJVM в Oracle добавлены следующие компоненты разного характера:
Компонента
|
Описание
|
JVM Aurora/Oracle JVM | Java Virtual Machine, выполняющая хранимый Java-код |
loadjava | Программа, вызываемая из операционной системы для загрузки в БД Java-элементов из файлов .java, .class, .properties, .jar, .zip, .sqlj |
dropjava | Программа, вызываемая из операционной системы для удаления из БД ранее загруженных Java-элементов |
CREATE JAVA SYSTEM | Создает в БД структуры для работы Java; аналогична SQL-предложению заведения БД CREATE DATABASE … |
{CREATE | ALTER | DROP} JAVA … | SQL-предложения категории DDL, во многом дублирующие функции программ loadjava и dropjava |
Модификации в CREATE PROCEDURE/FUNCTION … | Позволяют предъявлять хранимые Java-программы в зону видимости PL/SQL-программ |
JAVA_POOL_SIZE JAVA_MAX_SESSIONSPACE_SIZE JAVA_SOFT_SESSIONSPACE_LIMIT |
INIT-параметры, регулирующие использование памяти Java-программами в Oracle |
JAVASYSPRIV JAVAUSERPRIV |
Роли, которые дают возможность хранимым программам взаимодействовать с операционной системой (например, читать из файла) |
DBMS_JAVA | Системный пакет с процедурами и функциями для работы с Oracle JVM (большей частью - внутреннего пользования) |
DBMS_JAVA_TEST | Системный пакет для отладки хранимых процедур |
Jpublisher | Средство построения классов Java на основе объектных типов и типов REF в Oracle |
В зависимости от характера перечисленных компонент они заводятся либо при установке
программноый среды работы Oracle, либо при создании в БД среды JServer/OJVM.
Хранимым Java-программам в Oracle соответствуют методы Java, подверженные следующим ограничениям (версия 8.1):
Проще и короче всего установить JServer/OJVM в виде побочного следствия установки одной из стандартных конфигураций программной среды Oracle (например, Typical или Minimal в версии 8.1).
Тем не менее, JServer/OJVM можно доустановить к имеющейся программной среде, если он отсутствовал ранее, путем запуска сценария initjvm.sql из каталога %ORACLE_HOME%\javavm\install (система обозначений Windows).
Хранимые Java-программы могут создаваться в БД под Oracle двумя способами:
Ниже показаны оба способа на примере класса, создаваемого в рамках пакета training.demos.
Пусть в каталоге training/demos имеется файл MyJavaAgentInOracle.java (имеет отличия от файла MyHi.java, приведенного выше):
package training.demos;public
class MyJavaAgentInOracle { |
Загрузка в схему SCOTT БД текста кода для класса в этом файле (система обозначений Windows; в Unix-оболочках аналогично):
set CLASSPATH=%CLASSPATH%;%ORACLE_HOME%\javavm\aurora.zip
(в версии 9 %CLASSPATH%;%ORACLE_HOME%\javavm\lib\aurora.zip)
loadjava -user scott/tiger -o training/demos/MyJavaAgentInOracle.java
Если в том же каталоге у нас будет странслированный программой javac класс MyHiFromOracle, можно будет загрузить в БД сразу его:
loadjava -user scott/tiger -o training/demos/MyJavaAgentInOracle.class
Загрузить код того же класса можно по-другому:
CREATE JAVA SOURCE NAMED "training/demos/MyJavaAgentInOracle"
AS
public class MyJavaAgentInOracle { public static String sayHello (String toWhom)
{ return "Hello, "
+ toWhom + "!";
}
};
/
Обращение к Java-программе из Java-кода делается как обычно.
Для обращения к сохраненной в БД Java-программе из PL/SQL, ее следует опубликовать для этого языка:
CREATE FUNCTION say_hello_from_java_to
(to_whom IN VARCHAR2)
RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'training.demos.MyJavaAgentInOracle.sayHello (java.lang.String)
return java.lang.String';
/
После этого можно выполнить в SQL*Plus:
SET SERVEROUTPUT ON
EXEC DBMS_OUTPUT.PUT_LINE(say_hello_from_java_to('World'))
Справочная информация о программных элементах Java распределена между словарем-справочником СУБД (таблица DBA_OBJECTS) и специальными структурами, создаваемыми в каждой схеме, владеющей этими элементами.
При первой загрузке программных элементов Java в любую схему loadjava или команда CREATE JAVA создадут там:
Фактически загрузка программой loadjava вызывает неявную выдачу команды CREATE JAVA … . Описание программных элементов Java заносится в таблицу CREATE$JAVA$LOB$TABLE. Повторная загрузка одного и того же Java-элемента реально выполняться не будет, если только (а) он не изменил свое описание или (б) не указан ключ -force при вызове программы loadjava.
Java-объекты, заведенные в схеме, можно просмотреть из таблицы USER_OBJECTS словаря-справочника обычным способом:
COLUMN object_name FORMAT A30
SELECT object_name, object_type, status, timestamp
FROM user_objects
WHERE object_name NOT LIKE 'SYS_%' AND
object_name
NOT LIKE 'CREATE$%' AND
object_name
NOT LIKE 'JAVA$%' AND
object_name
NOT LIKE 'LOADLOB%' AND
object_type
LIKE 'JAVA %'
ORDER BY 2, 1;
Выгрузить из БД исходные тексты из "словаря-справочника объектов Java" конкретной схемы можно с помощью процедур пакета DBMS_JAVA:
DECLARE
PROCEDURE put_java_source(jclass IN VARCHAR2) IS
b CLOB;
v VARCHAR2(4000);
i INTEGER := 4000;
BEGIN
DBMS_LOB.CREATETEMPORARY(b, FALSE);
DBMS_JAVA.EXPORT_SOURCE(jclass, b);
DBMS_LOB.READ(b, i, 1, v);
DBMS_OUTPUT.PUT_LINE(v);
END;
BEGIN
put_java_source('training/demos/MyJavaAgentInOracle');
END;
/
Исходные тексты программ на Java в БД модно посмотреть также в консоли Oracle Enterprize Manager или в аналогичных системах третьих фирм.
Стандарт именования классов в Java допускает более длинные имена, чем предел в 30 знаков в SQL Oracle. Достаточно длинные Java-имена Oracle при помещении в словарь-справочник самостоятельно заменяет на придуманные более короткие. Получить первоначальное имя по присвоенному Oracle можно с помощью функции DBMS_JAVA.LONGNAME. Пример ее использования:
COLUMN shortname FORMAT A30
COLUMN longname FORMAT A60
SELECT object_name shortname,DBMS_JAVA.LONGNAME(object_name)
longname
FROM user_objects
WHERE object_type = 'JAVA CLASS';
Кроме того, при помещении составного имени Java в БД Oracle переводит точки в знаки "/", например
training.demos.MyHiFromOracle
в
training/demos/MyHiFromOracle.
Дополнительная информация
INTERFACE Ltd. |
|