JDBC Rudolf Jansen Freiberuflicher Entwickler und Autor http
JDBC Rudolf Jansen Freiberuflicher Entwickler und Autor http: //www. rudolf-jansen. de info@rudolf-jansen. de DOAG - SIG Development 8. 11. 2005 © 2005, Rudolf Jansen
Agenda ØJDBC-Treiberauswahl ØOracle 10 g-Treiber ØJDBC 4. 0: Ein Ausblick © 2005, Rudolf Jansen
JDBC • Java Data. Base Connectivity • Zugriff auf DB über Java-API-Funktionen • Abbildung auf konkrete Datenbank durch JDBC-Treiber Ø Portabilität (theoretisch) Prepared. Statement p. Stmt = conn. prepare. Statement( "select prs_nr, prs_vorname, prs_nachname from person where prs_nr = ? "); for( int i = 1; i<=3; i++ ){ // Parameter setzen p. Stmt. set. Int(1, i); // Statement ausfuehren res. Set = p. Stmt. execute. Query(); // Ergebnis ausgeben. . } © 2005, Rudolf Jansen
JDBC-Treibertypen Ø Typ 1 (JDBC-ODBC-Brücke) · Zugriff über ODBC (Open. Data. Base. Connectivity)-Treiber · Voraussetzung: Existenz eines ODBC-Treiber auf dem Clientrechner. ØTyp 2 (Native Treiber) · Umwandlung in herstellerspezifische Anfragen (bei Oracle OCI) · Voraussetzung: Existenz nativer Bibliotheken auf dem Clientrechner. © 2005, Rudolf Jansen
JDBC-Treibertypen Ø Typ 3 · Umwandlung in herstellerunabhängiges Netzprotokoll. · Voraussetzung: Datenbankhersteller unterstützt dieses Protokoll. Ø Typ 4 (Thin-Treiber) · Umwandlung in herstellerspezifisches Netzprotokoll auf Basis von Java Sockets. · basieren vollständig auf Java · Vorteil: keine spezielle Software auf Clientseite nötig èEinsatz bei Applets © 2005, Rudolf Jansen
Oracle-JDBC-Treiber Ø OCI-Treiber (clientseitig) · Zugriff über OCI-Bibliotheken (C-Routinen) Ø Thin-Driver (clientseitig) · 100 % Java · Zugriff über SQL*Net-Protokoll (Basis TCP/IP) Ø Thin-Driver (serverseitig) · Zugriff aus in der Datenbank laufenden Anwendungen auf andere Datenbanken Ø KPRB Treiber (serverseitig) · Zugriff aus in der Datenbank laufenden Anwendungen · Zugriff aus C-Routinen im selben Adressraum wie die SQL-Engine (Performancevorteile) © 2005, Rudolf Jansen
Oracle-JDBC-Treiber © 2005, Rudolf Jansen
Oracle-JDBC-Treiber • Thin versus OCI • Vorteile OCI – höherer Funktionsumfang (insbesondere bei Einsatz spezieller Oracle-Features) – schneller (? ) • Nachteil OCI: – erfordert bis einschl. 9 i Oracle-Client-Installation auf jedem Client-Rechner • Oracle 10 g: – „Instant Client“-Paket – otn. oracle. com/tech/oci/instantclient. html – Aufnahme der Dateien in den CLASSPATH genügt – keine Client-Installation mehr nötig © 2005, Rudolf Jansen
JDBC-Treiber • nicht jeder JDBC-Treiber unterstützt alle JDBC-Features • JDBC-Klasse Database. Meta. Data zur Abfrage der unterstützten Funktionen, z. B. - supports. Savepoints - supports. Statement. Pooling - supports. Get. Generated. Keys • JDBC-Treiber-Auswahl: http: //industry. java. sun. com/products/jdbc/drivers © 2005, Rudolf Jansen
JDBC-Treiber-Auswahl © 2005, Rudolf Jansen
JDBC-Treiber • Zu beachten: Nicht jeder Datenbankserver unterstützt alle JDBC-Features • Beispiel: Result Sets • Ab JDBC 2. 0: Scrollable Result. Sets – Auch Rückwärts-Sprünge, absolute und relative Sprünge Connection. create. Statement (int result. Set. Type, int result. Set. Concurrency) – Result. Set – Typen: TYPE_FORWARD_ONLY TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_SENSITIVE – Oracle: Clientseitiger Cache (Ressourcen-aufwendig) © 2005, Rudolf Jansen
Oracle 10 g-JDBC-Treiber Neue Features : • Connection Caching - Implicit Connection Cache - Fast Connection Failover • JDBC 3. 0 -Support mit Ausnahme von - Verarbeitung automatisch erzeugter Schlüssel - Result-Set Holdability - Rückgabe mehrerer Result-Sets eines JDBC-Statements • Verbesserung beim Einsatz des OCI-Treibers: - „Instant Client“-Paket - otn. oracle. com/tech/oci/instantclient. html - Aufnahme der Dateien in den CLASSPATH genügt - keine Client-Installation mehr nötig © 2005, Rudolf Jansen
JDBC-Connection-Cache • J 2 EE-Anwendungen – Connections werden nur kurz benötigt – kein Schließen der Verbindung – stattdessen Rückgabe in den Connection-Cache – bisher: alle Connections im Cache mit • der gleichen Datenbank und • dem gleichen DB-User Oracle 10 g: – Anforderung aus RAC-Architektur: Fast Connection Failover © 2005, Rudolf Jansen
Fast Connection Failover • Ausfall eines Knotens - Nachricht an den Connection-Pool - Umkonfiguration aller im Pool befindlichen Connections zu diesem Knoten • Wiederanlauf eines Knotens - Umkonfiguration zwecks Lastverteilung Oracle. Data. Source ds = new Oracle. Data. Source(); ds. set. User(. . . ); . . . ds. set. Connection. Caching. Enabled(true); ds. set. Fast. Connection. Failover. Enabled(true); © 2005, Rudolf Jansen
Oracle JDBC-Erweiterungen • zusätzliche Möglichkeiten – Umgang mit Oracle-eigenen Datentypen – Performancesteigerungen • ABER: Portabilitätsverlust • Package oracle. jdbc – ersetzt ab Oracle 9 i das bisherige Package oracle. jdbc. driver – enthält u. a. folgende Klassen: Oracle. Callable. Statement Oracle. Connection Oracle. Result. Set Oracle. Statement Oracle. Types © 2005, Rudolf Jansen
JDBC 4. 0 – Ziele § Anpassung an aktuellen SQL-Standard SQL 2003 (insbesondere XML-Anbindung) § Integration aktueller JSRs (Row. Sets) §„Ease-Of-Development“ § „Enterprise Needs“ § Java 1. 5 – Features (Annotations, Generics) © 2005, Rudolf Jansen
JDBC 4. 0 – J 2 SE 5 Features Annotations: § Codierung über Metadaten § Toolgestützte Auswertung § API-Zugriff § Anwendungsgebiete: - Codegenerierung (z. B. EJB, RMI) - Informationen für andere Anwendungen (z. B. Projektverwaltung) § Beispiel: deprecated class Test { @Deprecated public void eine. Alte. Methode(){ … }; public void die. Neue. Methode(){…}; } © 2005, Rudolf Jansen
Datenbankzugriffe mit JDBC 4. 0 § Kein „Driver. Manager“ mehr im Sourcecode § Java kümmert sich selber um JDBC-Treiber-Management § Verbindungsaufbau über @Database-Annotation: @Database(type=”Oracle”, host=”localhost”, port=” 4711”, user=”scott”, password=”tiger”); 1. Benutzerdefinierte Klasse für selektierte Daten class Employee. Results { public String name; public String dept; public Integer salary; © 2005, Rudolf Jansen }
Datenbankzugriffe mit JDBC 4. 0 1. Interface-Definition für Abfragen und DML interface Employee. Queries { @Query(SQL="SELECT * FROM EMPLOYEE") Employee. Results get. All. Employees(); @Query(SQL="SELECT * FROM EMPLOYEE WHERE salary > { sal } ") Employee. Results get. Managers(int sal); @Update(SQL="UPDATE EMPLOYEE SET salary = { sal } WHERE name = { name } ”) int change. Salary(int sal, String name); © 2005, Rudolf Jansen
Datenbankzugriffe mit JDBC 4. 0 1. Einsatz der Query. Factory All. Queries aq = Query. Factory. create (All. Queries. class); § Query. Factory „verarbeitet“ @Query- und @Update. Annotations, d. h. „generiert“ die Datenbankzugriffe © 2005, Rudolf Jansen
Datenbankzugriffe mit JDBC 4. 0 1. Datenbankzugriff über benutzerdefinierte Klasse Employee. Results (und Generics-Erweiterung aus J 2 SE 5) Data. Set<Employee. Results> rows = aq. get. All. Employees(); for (Employee. Results elem: rows) { System. out. println(elem. name); System. out. println(elem. dept); System. out. println(elem. salary); } Employee. Results new. Emp = new Employee. Results(); new. Emp. name = “Bill Gates”; new. Emp. dept = “Consulting”; new. Emp. salary = new Integer(10000); rows. insert(new. Emp); © 2005, Rudolf Jansen
JDBC 4. 0 – XML-Erweiterungen Neue XML-Features in SQL: 2003 § Nativer XML-Datentyp Beispiel (Oracle): create table person ( prs_nr number, prs_data XMLTYPE ); § SQL/XML-Funktionen © 2005, Rudolf Jansen
JDBC 4. 0 – XML-Datentyp Statement stmt = con. create. Statement(); Result. Set rs = stmt. execute. Query( „select <XMLSpalte> from tabelle …“); while(rs. next()) { XMLType xml. Spalte = (XMLType) rs. get. Object(1); org. w 3 c. dom. Document doc=xml. Spalte. get. DOM(); … } © 2005, Rudolf Jansen
JDBC 4. 0 – SQL/XML-Funktionen Aus SQLX-Standard § xmlagg() § xmlattributes() § xmlconcat() § xmlelement() § xmlforest() Ziel: Generierung einer XML-Darstellung aus relational gespeicherten Daten © 2005, Rudolf Jansen
JDBC 4. 0 – SQL/XML-Funktionen Beispiel: Relationale Tabelle person_rel create table person_rel ( prs_id NUMBER; prs_vorname VARCHAR 2(100); prs_nachname VARCHAR 2(100); ); © 2005, Rudolf Jansen
JDBC 4. 0 – SQL/XML-Funktionen Select XMLELEMENT( „Person“, XMLATTRIBUTES( prs_id AS „ID“), XMLFOREST( prs_vorname, prs_nachname ) ) from person_rel; <Person ID=„ 1“> <PRS_VORNAME>Willi</PRS_VORNAME> <PRS_NACHNAME>Schmitz</PRS_NACHNAME> </Person> <Person ID=„ 2“> <PRS_VORNAME>Peter</PRS_VORNAME> <PRS_NACHNAME>Meier</PRS_NACHNAME> </Person> 2 Zeilen ausgewählt © 2005, Rudolf Jansen
JDBC 4. 0 – SQL/XML-Funktionen Statement stmt = con. create. Statement(); Result. Set rs = stmt. execute. Query( „Select XMLELEMENT( „Person“, XMLATTRIBUTES( prs_id AS „ID“), XMLFOREST( prs_vorname, prs_nachname ) ) from person_rel“); while(rs. next()) { XMLType xml. Spalte = (XMLType) rs. get. Object(1); org. w 3 c. dom. Document doc=xml. Spalte. get. DOM(); … } © 2005, Rudolf Jansen
JDBC 4. 0 – Weitere Features Zusatzfunktionen für Connections: - „Connection. is. Valid()“ - „Connection. set. Client. Info()“ für Systemmonitoring (wer benutzt welche Ressourcen) - „Connection. set. Name()“ für exakteren Zugriff aus Connection. Pool auf eine bestimmte Connection © 2005, Rudolf Jansen
Literatur • JDBC 3. 0 -Spezifikation: http: //java. sun. com/products/jdbc/download. html#corespec 30 • JDBC 4. 0 Early Draft (JSR 221): http: //jcp. org/en/jsr/detail? id=221 • „Java Persistenz-Strategien: Datenzugriff in Enterprise-Anwendungen: JDO, JCA, EJB, JDBC, XML“ Andreas Holubek, Rudolf Jansen, Robert Munsky, Eberhard Wolff Software&Support Verlag 400 Seiten © 2005, Rudolf Jansen
- Slides: 29