|
|
|||||||||||||||||||||||||||||
|
Java и Oracle - это очень простоСодержание
Основные понятияНачиная с версии 8.1 в состав СУБД Oracle можно дополнительно включать так называемый JServer, позволяющий использовать для хранимых процедур помимо PL/SQL еще и язык Java. В состав JServer входят следующие элементы:
JVM Aurora способна исполнять методы Java ("хранимые Java-процедуры") и классы, хранимые в Oracle. В версии 9.0 JServer переименован в Oracle9i JVM (иногда - OJVM или же Enterprise Java Server). Место Java в архитектуре Oracle
|
||||||||||||||||||||||||||||||||||
| 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.
| Главная страница - Программные продукты - Статьи - Разработка ПО, Интеграция приложений и данных, СУБД и хранилища данных, Oracle |