Preview only show first 10 pages with watermark. For full document please download

Verlagerung Von Java- Anwendungen In Die Datenbank

   EMBED


Share

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