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