Вы находитесь на страницах старой версии сайта.
Переходите на новую версию Interface.Ru

СТАТЬЯ
07.02.03


Java и Oracle - это очень просто

© Владимир Пржиялковский,
координатор Евро-Азиатской Группы Пользователей 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

Наличие встроенной виртуальной машины 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 должны быть выставлены следующие минимально необходимые переменные среды окружения ОС:

Исполняемые модули из состава 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):

Установка JServer/OJVM в версиях 8.1 и 9

Проще и короче всего установить JServer/OJVM в виде побочного следствия установки одной из стандартных конфигураций программной среды Oracle (например, Typical или Minimal в версии 8.1).

Тем не менее, JServer/OJVM можно доустановить к имеющейся программной среде, если он отсутствовал ранее, путем запуска сценария initjvm.sql из каталога %ORACLE_HOME%\javavm\install (система обозначений Windows).

Пример создания хранимой Java-программы

Хранимые Java-программы могут создаваться в БД под Oracle двумя способами:

Ниже показаны оба способа на примере класса, создаваемого в рамках пакета 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 создадут там:

Фактически загрузка программой 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.

Обсудить на форуме Oracle

Рекомендовать страницу

INTERFACE Ltd.
Телефон/Факс: +7 (495) 925-0049
Отправить E-Mail
http://www.interface.ru
Rambler's Top100
Ваши замечания и предложения отправляйте редактору
По техническим вопросам обращайтесь к вебмастеру
Дата публикации: 07.02.03