2003 г
Java и Oracle - это очень просто
© Владимир
Пржиялковский,
координатор Евро-Азиатской Группы Пользователей Oracle,
преподаватель УКЦ Interface
Ltd.
Содержание
Основные понятия
Начиная с версии 8.1 в состав СУБД Oracle можно дополнительно включать так
называемый JServer, позволяющий использовать для хранимых процедур помимо PL/SQL
еще и язык Java. В состав JServer входят следующие элементы:
- виртуальная Java-машина JVM под названием Aurora, поддерживающая среду
для выполнения Java-программ и библиотеки классов Java
- средства увязки с PL/SQL
- ряд других
JVM Aurora способна исполнять методы Java ("хранимые Java-процедуры")
и классы, хранимые в Oracle.
В версии 9.0 JServer переименован в Oracle9i JVM (иногда - OJVM или же Enterprise
Java Server).
Место Java в архитектуре Oracle
Наличие встроенной виртуальной машины Java в Oracle -дополнительная возможность
по отношению к базовой поставке.
Начиная с версии 9.2 встроенная в СУБД виртуальная машина Java не поддерживает
магазины протоколов J2EE и CORBA. В частности, с этого времени нет возможности
разместить в БД под управлением Oracle контейнеры для EJB, JSP и сервлетов (OSE),
как это было раньше. Их предлагается размещать в среде OC4J из состава Oracle
9i Application Server. Встроенная машина Java продолжает поддерживать только
работу хранимых процедур, JDBC и SQLJ.
Соотношение и взаимосвязь PL/SQL и Java в Oracle
Java в Oracle представляет собой полнофункциональную замкнутую систему, однако
классы Java средствами Oracle можно "публиковать" для PL/SQL-машины
и вызывать из программ на PL/SQL.
Вплоть до версии 9.2 включительно PL/SQL в Oracle несравнимо эффективнее отрабатывает
SQL-запросы. С другой стороны Java обладает более богатой и универсальной языковой
средой для описания приложений.
Особенности Java и среда работы программ на Java
Архитектура и принципы работы Java резко отличаются от архитектуры и принципов
работы PL/SQL. Ниже излагаются некоторые особенности Java, существенные для
использования этого языка при работе с Oracle.
Программные компоненты в среде разработки на Java
Основными программными компонентами в среде разработки на Java являются исходный
код, класс, пакет, интерфейс, файл ресурсов. Взаимоотношение показано на рисунке.
Пакет используется для логический группировки программных единиц Java.
Архив используется для физической группировки программных единиц Java,
необходимых для работы конкретной Java-программы, могущих быть вызваных прямо
или по цепочке. Технологически часто единственная альтернатива неимоверному
числу .class-файлов.
Установка среды разработки на Java
Для ведения разработок с использованием 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/.
Среда окружения OC
Для работы программ среды разработки Java должны быть выставлены следующие
минимально необходимые переменные среды окружения ОС:
- CLASSPATH. Переменная, которая указывает на местонахождение файлов с классами,
необходимыми для трансляции или выполнения java-программы. Местонахождением
может быть (а) каталог файловой системы, в котором расположены файлы с классами
и (б) zip- или jar-файл с теми же файлами, упакованными внутрь. Путь к файлу
с классом должен быть согласован с полным именем класса, включающим имя пакета.
Если имя пакета не используется, в CLASSPATH следует включить "."
(указание на текущий каталог). (Строго говоря, для работы программ java и
javac переменную CLASSPATH можно и не выставлять, но тогда эти программы обязаны
использовать ключ -classpath, иначе не обязательный.)
- PATH. Сюда нужно включить доступ к программам среды разработки.
Исполняемые модули из состава 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
Теперь можно открыть консольное окошко и прогнать нужный командный файл.
Создание самостоятельных программ на Java
Пример транслирования и выполнения Java-программы
Файл с программой под названием 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
Создание хранимых программ на Java в Oracle
Oracle позволяет хранить Java-программы и вызывать их на исполнение с помощью
встроенной JVM, полностью наподобие хранимым PL/SQL-процедурам, исполняемым
встроенной PL/SQL-машиной.
Дополнительные компоненты СУБД Oracle для работы с хранимыми
Java-программами
Для работы с хранимыми 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-программ
Хранимым Java-программам в Oracle соответствуют методы Java, подверженные следующим
ограничениям (версия 8.1):
- методы, публикуемые для использования в SQL или PL/SQL, должны быть объявлены
как статические
- классы не могут делать во время исполнения обращений к GUI-классам (например,
к awt)
Установка JServer/OJVM в версиях 8.1 и 9
Проще и короче всего установить JServer/OJVM в виде побочного следствия установки
одной из стандартных конфигураций программной среды Oracle (например, Typical
или Minimal в версии 8.1).
Тем не менее, JServer/OJVM можно доустановить к имеющейся программной среде,
если он отсутствовал ранее, путем запуска сценария initjvm.sql из каталога %ORACLE_HOME%\javavm\install
(система обозначений Windows).
Пример создания хранимой Java-программы
Хранимые Java-программы могут создаваться в БД под Oracle двумя способами:
- загрузкой извне с помощью программы loadjava и
- SQL-предложением CREATE/ALTER JAVA …
Ниже показаны оба способа на примере класса, создаваемого в рамках пакета training.demos.
Создание с помощью loadjava
Пусть в каталоге training/demos имеется файл MyJavaAgentInOracle.java
(имеет отличия от файла MyHi.java, приведенного выше):
package training.demos;public
class MyJavaAgentInOracle {
public static String sayHello
(String toWhom) {
return
"Hello, " + toWhom + "!";
}
}
|
Загрузка в схему 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
Создание SQL-предложением
Загрузить код того же класса можно по-другому:
CREATE JAVA SOURCE NAMED "training/demos/MyJavaAgentInOracle"
AS
public class MyJavaAgentInOracle { public static String sayHello (String toWhom)
{ return "Hello, "
+ toWhom + "!";
}
};
/
Обращение к загруженной в Oracle процедуре Java
Обращение к 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 создадут там:
- CREATE$JAVA$LOB$TABLE - таблицу для хранения кода Java-программ
- JAVA$CLASS$MD5$TABLE - хеш-таблицу для хранения цифровых подписей (digest)
для каждого загружаемого объекта (с целью учета необходимости перетранслировать
предъявляемый объект)
- Несколько вспомогательных объектов, играющих вместе с этими двумя таблицами
роль своеобразного "словаря-справочника программных элементов Java"
в конкретной схеме.
Фактически загрузка программой loadjava вызывает неявную выдачу команды CREATE
JAVA … . Описание программных элементов Java заносится в таблицу CREATE$JAVA$LOB$TABLE.
Повторная загрузка одного и того же Java-элемента реально выполняться не будет,
если только (а) он не изменил свое описание или (б) не указан ключ -force при
вызове программы loadjava.
Просмотр Java-элементов
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.