Verlagerung von Java- Anwendungen in die Datenbank

Werbung
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
<<ALL FILES>>
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
Herunterladen