Java in der Datenbank

Werbung
Java in der Datenbank
Rudolf Jansen
Freiberuflicher Entwickler und
Autor
[email protected]
DOAG SIG Development,
6.3.2003
© 2003, Rudolf Jansen
Agenda
 Motivation
 Java in der DB - Historie
 loadjava-Tool
 Java Stored Procedures
 Resolving
 Administration
 Besonderheiten
 Vergleich Java - PL/SQL
© 2003, Rudolf Jansen
Motivation - Java-Architekturen
JDBC-Applikation
SQLJ-Applikation
SQL-NetZugriff
SQL-NetZugriff
Oracle 9i Rel.2 -Datenbank
Oracle JVM
© 2003, Rudolf Jansen
Motivation
 Normalfall: Externe Java-Anwendung
- DB-Anbindung über JDBC oder SQLJ
- (Netzwerk-)Zugriff auf die DB ist häufig der Engpass
 Datenintensive Anwendungen: PL/SQL
- „Programm läuft da, wo die Daten liegen“
- Vorteil: Keine Typumwandlung erforderlich, da
SQL-Datentypen verwendet werden
- Nachteil: weniger APIs für Anbindung an externe
Systeme (Mail, Dateizugriffe, XML-Parsing, ...)
 Gesucht: Goldener Mittelweg
 Java in der Datenbank
© 2003, Rudolf Jansen
Java in der Datenbank
Oracle JVM-Übersicht:
• erstmals in Oracle 8.1.5 (JDK 1.1.6)
• JDK 1.2 ab Oracle 8.1.6
• Oracle 9i Release 2:
– JDK 1.3
– kein J2EE mehr
 J2SE in der Datenbank
 J2EE im Application Server
• nach Standard-Installation verfügbar
• sqlplus-Startmeldung:
Verbunden mit:
Oracle9i Enterprise Edition Release 9.2.0.1.0 – Prod
With the Partitioning, OLAP and Oracle Data Mining o
JServer Release 9.2.0.1.0 – Production
© 2003, Rudolf Jansen
loadjava -Tool
Java-Source-Code
(*.java)
Java-Class-Dateien
(*.class)
JAR-Archive
(*.jar)
loadjava
Oracle-DB
JavaCompiler
JavaSourcen
JavaKlassen
JavaRessourcen
© 2003, Rudolf Jansen
loadjava -Tool
Beispiel HelloWorld.java:
public class HelloWorld
{
public static void main(String args[])
{
System.out.println("Hello World from Main-Method");
}
public static void test()
{
System.out.println("Hello World from Test-Method");
}
}
• %ORACLE_HOME%\bin\loadjava -user test/test resolve –verbose
HelloWorld.java
creating :
loading :
creating :
resolving:
source HelloWorld
source HelloWorld
HelloWorld
source HelloWorld
© 2003, Rudolf Jansen
Java in der Datenbank
• Ablage von Java-Sourcecode und Java-Klasse
als Schemaobjekt im Schema des loadjava-Users
select object_name, object_type,
status
from user_objects
where object_type like '%JAVA%';
OBJECT_NAME
OBJECT_TYPE
STATUS
--------------------------------------------------------------HelloWorld
JAVA
CLASS
VALID
© 2003,
Rudolf Jansen
Java in der Datenbank
•Alternative: Direktes Anlegen in der Datenbank
create or replace and compile java source name
HelloWorldInTheDatabase
as
public class HelloWorldInTheDatabase
{
public static void test()
{
System.out.println("Hello World from the D
}
}
Java wurde erstellt.
© 2003, Rudolf Jansen
Java in der Datenbank
•Administration über Oracle Enterprise Manager
© 2003, Rudolf Jansen
Java Stored Procedures
• Aufruf über Java Stored Procedure
• „PL/SQL mit Java-Aufrufen“
create or replace procedure
start_helloworld
as language java
name 'HelloWorld.test()';.
• Aufruf dieser Wrapper-Funktion
execute start_helloworld;
Hello World from Test-Method
PL/SQL-Prozedur wurde erfolgreich
abgeschlossen.
• Voraussetzung (da sonst nur Ausgabe in
das Tracefile) © 2003, Rudolf Jansen
Resolving
• kein Dateisystem in der Datenbank
 kein CLASSPATH
• stattdessen Suche nach den Javaklassen in den folgenden
Datenbankschemata
 Schema des aufrufenden Users
 über PUBLIC-Synonyme u.a. im
SYS-Schema (enthält die J2SE-Klassen)
• Reihenfolge kann über RESOLVE-Klausel
beim Laden der Klasse überschrieben werden
© 2003, Rudolf Jansen
Resolving
Beispiel:
• Laden einer geänderten HelloWorld.java-Datei
in das Schema SCOTT
public class HelloWorld
{
public static void main(String args[])
{
System.out.println("Hello World from Scott");
}
public static void test()
{
System.out.println("Hello World from Scott-test");
}
}
%ORACLE_HOME%\bin\loadjava -user scott/tiger -resolve -verbose
© 2003, Rudolf Jansen
Resolving
select object_name, owner, object_type, status
from all_objects
where object_type = 'JAVA CLASS'
and object_name = 'HelloWorld';
OBJECT_NAME
OWNER
OBJECT_TYPE
STAT
----------------------------------------------HelloWorld
SCOTT
JAVA CLASS
HelloWorld
TEST
JAVA CLASS
2 Zeilen ausgewählt.
© 2003, Rudolf Jansen
Resolving
create or replace and compile java source named
resolver ((*SCOTT) (*TEST) (*PUBLIC))
as
public class HelloWorldResolver
{
public static void test()
{
HelloWorld.test();
}
}
• alternativ auch Angabe über die -resolve-Optio
© 2003, Rudolf Jansen
Resolving
create or replace procedure start_helloworld_re
as language java
name 'HelloWorldResolver.test()';
Prozedur wurde angelegt.
execute start_helloworld_resolver;
Hello World from Scott-test
PL/SQL-Prozedur wurde erfolgreich abgeschlossen
© 2003, Rudolf Jansen
Administration
Init-Parameter:
• SHARED_POOL_SIZE
- Default: 50 MB
- Laden und Resolven von Java-Klassen
• JAVA_POOL_SIZE
• Default: 20 MB
• jeder Java-Aufruf erfolgt in eigener JVM und eigene
• Java_Pool enthält von mehreren Cleints gemeinsam
genutzen Code und Read-Only-Daten
 Speicherbedarf pro JVM : ca. 40 KB
© 2003, Rudolf Jansen
Administration
Init-Parameter:
• JAVA_SOFT_SESSIONSPACE_LIMIT
• JAVA_MAX_SESSIONSPACE_LIMIT
- Überwachung des Speicherbedarfs einer Java-Anwendu
- ähnlich: ulimit (UNIX)
- Überschreitung der JAVA_SOFT_SESSIONSPACE_LIMIT-Gre
 Warnmeldung ins Trace-File
- Überschreitung der JAVA_MAX_SESSIONSPACE_LIMIT-Gren
 Out-Of-Memory-Fehler
 „Notbremse“ gegen übermäßige Belegung des Java© 2003, Rudolf Jansen
Administration
Rechtevergabe:
• Sicherheitskonzept der Oracle 9i JVM basiert
Java 2 Security-Konzept
• Rechtevergabe und Verwaltung über PolicyTable
• insbesondere Zugriffsrechte auf Betriebssyste
- Dateien
- Sockets
- ...
© 2003, Rudolf Jansen
Administration
desc user_java_policy
KIND
GRANTEE_NAME
TYPE_SCHEMA
TYPE_NAME
NAME
ACTION
ENABLED
SEQ
VARCHAR2(8)
NOT NULL VARCHAR2(30)
NOT NULL VARCHAR2(30)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(8)
NUMBER
Package DBMS_JAVA:




grant_permission
(Vergabe eines positiven Rechts)
restrict_permission (Vergabe eines negativen Rechts)
revoke_permission (Rücknahme eines Rechts)
disable_permission (Ausschalten eines Eintrages der Po
© 2003, Rudolf Jansen
Administration
Beispiel: Leserechte auf C:\tmp für alle,
Schreibrechte nur für den User TEST:
• call dbms_java.grant_permission('PUBLIC',
'java.io.FilePermission',
'C:\tmp\*',
'read');
• call dbms_java.grant_permission('TEST',
'java.io.FilePermission',
'C:\tmp\*',
'read,write');
© 2003, Rudolf Jansen
Administration
select * from user_java_policy
where type_name='java.io.FilePermission'
and name like '%C:%'
KIND
GRA...
TY...
TYPE_NAME
NAME
ACT
-----------------------------------------------------------------GRANT PUBLIC
SYS
java.io.FilePermission
C:\tmp\* read
GRANT
TEST
SYS
java.io.FilePermission
2 Zeilen ausgewählt.
© 2003, Rudolf Jansen
C:\tmp\* read
Besonderheiten
Besonderheiten bei serverseitigen Java-Anwendungen:
• GUI-Komponenten machen keinen Sinn und werden daher nicht
unterstützt
• (J2SE-)Javasourcecode kann von Java-Client-Applikationen
übernommen werden
• Aufrufstelle ist nicht nur die main-Methode, sondern jede
statische Methode
• kein Connect()-Befehl erforderlich, da Aufruf und Ausführung
innerhalb einer Datenbanksession
• native Compilierung
• kein Multithreading
© 2003, Rudolf Jansen
Threading
• alle Java-Threads laufen innerhalb eines
Betriebssystem-Threads
- Multithreaded Java-Code kann übernommen
werden
- Aber: kein Performancegewinn zu erwarten
• Empfehlung:
- DB-interne Anwendungen mit einem Thread
implementieren
- falls Parallelverarbeitung in x Threads
gewünscht ist:
 x Java-Aufrufe in x verschiedenen JVMs
starten
(pro JVM ca. 40 KB Speicherbedarf)
© 2003, Rudolf Jansen
 Koordination
der x JVMs übernimmt die
Wann Java, wann PL/SQL
PL/SQL:
+ datenintensive Anwendungen
+ Verwendung von SQL-Datentypen
 keine Typumwandlung
+ keine zusätzliche JDBC-Schicht
Java:
+ Einsatz von (J2SE-)API-Schnittstellen
(Filehandling, Mailversand, ...)
+ Kombination mit XML in der Datenbank
Allgemeine Kriterien:
- Know-How-Trennung in der Entwicklergruppe
- zentrale Administration von DB- und Java-Komponenten
- Performance-Tests mit realen Projekt-Daten(mengen)
© 2003, Rudolf Jansen
Literatur
• OTN-Webseiten http://otn.oracle.com
– Dokumentation
– Sourcecode-Beispiele
• „Oracle, Java, XML. Integration in Oracle 9i“
Rudolf Jansen
Software&Support Verlag
ca. 360 Seiten
ISBN 3-935042-33-7
erscheint März 2003
© 2003, Rudolf Jansen
Herunterladen