Transcript
Verlagerung von JavaAnwendungen in die Datenbank Markus Fiegler ORDIX AG
[email protected]
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Agenda Agenda: • • • • • • • • •
Einführung und Motivation Java Stored Procedures Besonderheiten der OracleJVM Laden der Java-Klassen in die DB Resolving-Konzept Veröffentlichung von Java-Klassen in der Datenbank Anwendungsmöglichkeiten von Java Stored Procedures Java Native Interface Resümee
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Einführung und Motivation Warum Java in der Datenbank? • Java ist eine Programmiersprache für Client, Server, Komponenten (JavaBeans) und Stored Procedures. • Vorteile wie z. B. Bytecode-Verifikation, Vererbung, Abstraktion, Automatische Garbage Collection... können genutzt werden. • Java ist sicher und robust, z. B. keine Zeiger, kein direkter Zugriff auf Adressen im Speicherbereich. • Erweiterung der Datenbank-Funktionalität um JavaFunktionsbibliotheken • Datenbankunabhängigkeit (JDBC-Treiber) • Minimierung der Netzlast • Verbesserung der Performance
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java Stored Procedures • Datenbankunabhängigkeit mit Java Stored Procedures
Oracle
DB2
Sybase
...
Java Stored Procedures
Java Stored Procedures
Java Stored Procedures
Java Stored Procedures
Java Stored Procedures
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
OracleJVM • OracleJVM ist eine in den Kernel von Oracle implementierte Java Virtual Machine (JVM). • Ab Oracle 10g stehen J2SE 1.4 und JDBC 3.0 in der Datenbank zur Verfügung. • Die Java-Systemklassen befinden sich in einem $ORACLE_HOME/javavm/admin Verzeichnis auf dem Datenbankrechner. • Native Compiler
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Besonderheiten der OracleJVM Bei der Entwicklung von Java-Anwendungen für die OracleJVM muss man auf folgende Besonderheiten achten: • Jede statische Methode kann als Programmeinstiegspunkt verwendet werden. • Es gibt keine Unterstützung für GUI-Komponenten wie AWT und Swing. • Multithreading wird nicht unterstützt. • Es muss der serverseitige JDBC-Treiber verwendet werden.
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Serverseitige JDBC-Treiber Bei der Verwendung des datenbankinternen JDBC-Treibers müssen folgende Punkte berücksichtigt werden: • Der serverseitige JDBC-Treiber muss im Programm nicht registriert werden, da dieser bereits im Oracle Server integriert ist. • Die DB-Verbindung kann nicht physisch geschlossen werden. • Die Verwendung von Auto-Commits wird nicht unterstützt. • Eine Verbindung zu einer entfernten Datenbank ist mit dem serverseitigen JDBC-Treiber nicht möglich. • Die JDBC-Datenbankverbindung wird mit der Zeichenkette "jdbc:default:connection:" ermittelt, z. B. DriverManager.getConnection("jdbc:default:connection:").
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Beispiel einer JavaDatenbankanwendung import java.sql.*; import oracle.sql.*; import oracle.jdbc.driver.*; public class Mitarbeiter extends Object { public static void setGehalt(int ma_nr, int gehalt) { try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl10","mf","mf"); String sqlUpdate = "UPDATE ma SET gehalt = ? WHERE ma_nr = ?"; PreparedStatement pstmt = conn.prepareStatement(sqlUpdate); pstmt.setInt(1, gehalt); pstmt.setInt(2, ma_nr); pstmt.executeUpdate(); conn.close(); pstmt.close(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { setGehalt(1, 900); } }
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Für die Ausführung in DB angepasste Java-Datenbankanwendung import java.sql.*; import oracle.sql.*; import oracle.jdbc.driver.*; public class Mitarbeiter extends Object { public static void setGehalt(int ma_nr, int gehalt) { try { //DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection( "jdbc:default:connection:"); String sqlUpdate = "UPDATE ma SET gehalt = ? WHERE ma_nr = ?"; PreparedStatement pstmt = conn.prepareStatement(sqlUpdate); pstmt.setInt(1, gehalt); pstmt.setInt(2, ma_nr); pstmt.executeUpdate(); //conn.close(); pstmt.close(); } catch(Exception e) { e.printStackTrace(); } } //public static void main(String[] args) { setGehalt(1, 900); } }
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Laden der Java-Klassen in die DB Es können folgende Dateiarten in ein Datenbankschema geladen werden: • Java-Sourcecode-Datei (*.java) • Java-Class-Datei (*.class) • Java-Ressource-Datei (*.jar bzw. *.zip)
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Laden der Java-Klassen in die DB
.java Datei
.class Datei
.jar Datei
loadjava
Oracle-DB Java Compiler
Java Source
Java Class
Java Resource
DB-Schema
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Laden der Java-Klassen in die DB • Auf der Betriebssystemebene: loadjava -user mf/mf@orcl10 -resolve -verbose C:\java\Jora.class
• Im SQL Plus: exec dbms_java.loadjava('-resolve -verbose C:\java\Jora.class') Voraussetzung: exec dbms_java.grant_permission('MF', 'java.io.FilePermission','C:\java\*','read')
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java-Klassen aus der DB entfernen • Auf der Betriebssystemebene: dropjava -user mf/mf@orcl10 -verbose Jora • Im SQL Plus: exec dbms_java.dropjava('-verbose Jora')
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java 2 Security-Konzept • Zugriff auf Ressourcen wird mit einer Java-Policy Tabelle im Schema SYS sichergestellt. • Die Rechte lassen sich über USER_JAVA_POLICY bzw. DBA_JAVA_POLICY abfragen. • Das DBMS_JAVA Paket enthält Prozeduren für die Verwaltung von Rechten. • Mit JAVA_ADMIN Rolle können Rechte für Java-Anwendungen administriert werden.
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java 2 Security-Konzept • Es können unter anderem Rechte, gemäß dem Java 2 SecurityKonzept, zur folgenden Rechte-Klassen verwaltet werden: − java.io.FilePermission − java.net.SocketPermission − java.lang.RuntimePermission − java.net.NetPermission − oracle.aurora.rdbms.security.PolicyTablePermission − ... Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java 2 Security-Konzept • Auszug aus der DBA_JAVA_POLICY View:
KIND -------GRANT RESTRICT GRANT GRANT ...
GRANTEE ------MF PUBLIC SYS SYSTEM
TYPE_NAME --------------------------java.io.FilePermission java.lang.RuntimePermission java.lang.RuntimePermission java.io.FilePermission
Copyright by ORDIX AG
NAME -------------------C:\java loadLibrary.* loadLibrary.corejava <
>
ACTION ENABLED SEQ ------ ------- --read ENABLED 182 ENABLED 71 ENABLED 61 read ENABLED 101
Verlagerung von Java-Anwendungen in die Datenbank
DBMS_JAVA • Das DBMS_JAVA Package verfügt unter anderem über folgende Prozeduren bzw. Funktionen: dbms_java.loadjava(...) dbms_java.dropjava(...) dbms_java.grant_permission(...) dbms_java.restrict_permission(...) dbms_java.disable_permission(...) dbms_java.enable_permission(...) dbms_java.delete_permission(...) dbms_java.set_output(...) dbms_java.longname(...) dbms_java.shortname(...) ... Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Resolving-Konzept • Resolving-Konzept ist eine Alternative zum CLASSPATH-Konzept. • Suchreihenfolge: Schema des Datenbankbenutzers, SYS • Resolving-Liste • DBA_JAVA_RESOLVERS enthält eine Übersicht über die vorhandenen Resolving-Listen. • Eine Resolving-Liste bezieht sich immer nur auf eine Java-Klasse. Beispiel: loadjava -resolver ((*BK)(*MF)(*PUBLIC)) ...
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Resolving-Konzept • Beispiel mit einer Resolving-Liste:
CREATE AND COMPILE JAVA SOURCE NAMED mf.StartProg RESOLVER ((*BK)(*MF)(*PUBLIC)) AS public class StartProg { public static void setGehalt(int ma_nr, int gehalt) { Mitarbeiter.setGehalt(ma_nr, gehalt); } } /
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Veröffentlichung von Java-Klassen in der Datenbank • Signaturen der Java-Methoden einer Java-Klasse werden im Data Dictionary veröffentlicht. werden abgebildet Java-Methode
PL/SQL-Wrapper
• PL/SQL-Wrapper werden auch als Aufrufspezifikationen, Call Specs oder Java Stored Procedures bezeichnet.
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Veröffentlichung von Java-Klassen in der Datenbank Die PL/SQL-Wrapper können auf folgende Art und Weise definiert werden: • Aufrufspezifikation auf höchster Ebene, d. h. auf derselben hierarchischen Ebene wie andere Objekte wie z. B. Tabellen oder Sichten • Aufrufspezifikation als PL/SQL Package-Prozedur • Aufrufspezifikation als Methode eines Objekttyps
Beispiel eines PL/SQL-Wrappers: CREATE OR REPLACE PROCEDURE rechne_java( bis IN NUMBER) AS LANGUAGE JAVA NAME 'Test.rechne(int)'; / Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Parameterübergabe zwischen PL/SQL und Java • In der Datenbankprogrammiersprache PL/SQL können die Parameter einer Prozedur mit folgenden Modi definiert werden: − IN (nur lesen) − OUT (nur schreiben) − IN OUT (lesen und schreiben) • Die primitiven Java-Datentypen (Übergabe als Wert) werden als IN Parameter in PL/SQL abgebildet. • Java-Objekte (Übergabe als Referenz) werden als IN OUT Parameter in PL/SQL umgesetzt.
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Parameterübergabe zwischen PL/SQL und Java • Zuordnungen der Java- und PL/SQL-Datentypen
SQL-Typ
Java-Typ
CHAR, LONG, VARCHAR2
oracle.sql.CHAR, java.lang.String ...
DATE
oracle.sql.DATE, java.sql.Date ...
NUMBER
oracle.sql.NUMBER, java.lang.Integer, java.lang.Float, short, double ...
BLOB
oracle.sql.BLOB ...
...
...
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Aufruf der Java Stored Procedures
Oracle Datenbank Oracle Forms Oracle Net
Java Applikation
ODBC Client
Copyright by ORDIX AG
Oracle Net
Oracle Net
Java Stored Procedure
PL/SQL Stored Procedure
Verlagerung von Java-Anwendungen in die Datenbank
Exception Handling • Alle Java-Exceptions werden mit ORA-29532 an SQL bzw. PL/SQL weitergereicht: eingeschränktes Exception Handling SQL> exec test('b') Test$EWrongValue at Test.starte_test(Test:10) BEGIN test('b'); END; * FEHLER in Zeile 1: ORA-29532: Java-Aufruf durch nicht abgefangene Java-Exception beendet: Test$EWrongValue ORA-06512: in "MF.TEST", Zeile 1 ORA-06512: in Zeile 1 Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Anwendungsmöglichkeiten von Java Stored Procedures • Umfangreiche Java-Funktionsbibliotheken (API) können genutzt werden: - Zugriff auf Dateien (java.io) - Dateikomprimierung (java.util.zip) - Logging Mechanismen - Assertions - ... • Java kann für rechenintensive Operationen verwendet werden.
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Anwendungsmöglichkeiten von Java Stored Procedures • Integration verschiedener EDV-Systeme Andere EDVSysteme
RPC
JVM
RMI
J2EE Applikationsmodule
Datenbanken verschiedener Hersteller
HTTP JDBC
Java Stored Procedures
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java Native Interface • Aufruf einer JDBC-Anwendung vor 10g
JDBC-Anwendung
PL/SQL-Wrapper Java-Klasse OracleJVM
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java Native Interface • Aufruf einer JDBC-Anwendung ab 10g
JDBC-Anwendung mit Client-Stub Java Native Interface
Java-Klasse OracleJVM
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java Native Interface • Java Native Interface ermöglicht einen direkten Zugriff auf public static Methoden einer Java-Klasse in der OracleJVM. • Mit JPublisher lassen sich Client-Proxy Klassen erzeugen. jpub -u user/passwd@db -java=Klasse.java • Zugriff auf serverseitige Java-Methoden über die Client-Proxy Klassen (client-side stub API). • Die Client-Proxy Klassen werden im Anwendungscode mit einer JDBC-Connection als Parameter instanziert.
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Java Native Interface Vorteile bei der Verwendung von Java Native Interface: • PL/SQL-Wrapper kann entfallen • Keine Einschränkungen bei der Verwendung von ParameterDatentypen • Datenkonvertierung Java - PL/SQL- Java nicht nötig • Besseres Exception-Handling wegen Java - Java.
Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank
Resümee • Mit Java in der Datenbank kann die Funktionalität einer Datenbank deutlich erweitert werden. • Java Stored Procedures sind datenbankunabhängig. • Durch die Verwendung von Java Stored Procedures: − sinkt die Programmausführungszeit − die Netzlast wird minimiert − wird eine gute Performance erzielt. • Java und PL/SQL schließen sich für die serverseitige DBProgrammierung nicht aus, sondern können sich ergänzen. • Java Native Interface ist eine nützliche Erweiterung. Copyright by ORDIX AG
Verlagerung von Java-Anwendungen in die Datenbank