Datenbanksysteme SS 2007 Frank Köster (Oliver Vornberger) Institut für Informatik Universität Osnabrück
Kapitel 8a: Datenbankapplikationen
ODBC & JDBC ODBC & JDBC Was ist ODBC & JDBC? ODBC = Open Database Connectivity JDBC = JAVA Database Connectivity Software zum Zugriff auf heterogene DBMS-Landschaft... insbesondere verschiedene Hersteller (weiteres auf Folie 5) Unterstützt Anfragen über mehrere Tabellen aus unterschiedlichen Quellen (Verknüpfung verteilter DBMS Joins) Unterstützung dynamischer Anfragen Festlegung eines Sprachstandards (ODBC-SQL) diverse Features (Stored Procedures, Trigger...) Festlegung von Datentypen etwa für... numerische Werte, Strings, Datum, Zeit... Festlegung einer Programmiersprachenkopplung (CLI = Call Level Interface mehr auf nächster Folie)
ODBC & JDBC ODBC & JDBC Was ist CLI? Funktionsbasierte Aufrufschnittstelle Kommt in vielerlei Ausprägung vor... z.b. OCI (Oracle), ODBC (Microsoft), DB Library (Sybase), CLI (SQL Access Group) Aufgaben Verbindungsmanagement SQL-Anweisungen verarbeiten Ergebnisse und Fehler verarbeiten Beispiel JDBC JDBC-Treiber transportiert nur SQL-Kommandos Definiert nicht, welche Kommandos verw. werden dürfen SUN verlangt aber, dass alle JDBC-Treiberhersteller mindestens SQL-2 Entry-Level-Standard von 1992 erfüllen. Was passiert bei Wechsel der Datenbank (Aufwand)?
ODBC & JDBC ODBC & JDBC Warum will man ODBC & JDBC? Firmen setzen vernetzte Computersysteme ein Daten werden meist zentral in DBMS verwaltet nicht auf Arbeitsplatzrechner In vielen Firmen werden mehrere (verschiedene) DBMS genutzt Gründe hierfür... wichtige Anwendung ist nur für bestimmtes DBMS verfügbar Performanzeigenschaften bei bestimmten DB-Funktionen gewachsene Systeme ( alte Zöpfe ) unterschiedliche Erfahrungen Ein Beispiel für eine ODBC-Nutzung...
ODBC ODBC Die Rolle von ODBC in einer komplexen Architektur... Excel Access Lohnabrechnung ODBC Treiber Manager Oracle Treiber MS SQL Server Treiber Xbase Treiber Informix Treiber EDA/SQL Treiber DB2 Gateway Treiber Client SQL*Net Net-Lib Net-Lib EDA-Link Net-Lib dbf Files Server SQL*Net Net-Lib Net-Lib EDA-Link Net-Lib Oracle7 MS SQL Server Informix Online IBM DB2 Gateway
ODBC ODBC Bestandteile einer ODBC-Architektur Anwendungen verantwortlich für Interaktion mit Benutzer Aufruf von ODBC-API-Funktionen Treiber-Manager lädt bei Bedarf den jeweils von Anwendung geforderten Treiber 1 delegiert Funktionsaufrufe an zuständige Treiber nächste Folie Treiber verarbeiten ODBC-Funktionsaufrufe 2 richten SQL-Anfragen an Datenquellen kapseln die gesamte DB- und Netzwerk-Funktionalität Folien 9-11 Datenquellen Datenmengen und entsprechende Umgebungen kapseln Betriebssystem, DBMS (ggf. auch Netzwerk)
ODBC ODBC Bestandteile einer ODBC-Architektur Treiber-Manager Verwaltet gleichzeitig mehrere Clients und mehrere Treiber Leitet Funktionsaufrufe an zuständige Treiber weiter Fehlerüberprüfung Verwaltung von virtuellen Methodentabellen der Treiber realisiert über DLLs oder shared objects (je nach Betriebssystem) Verwaltung über Handles (Verbindungs-/Environment-Handle) Benutzungsoberfläche Verbindung zur Datenquelle herstellen Administration Treiber hinzufügen, löschen...
ODBC ODBC Bestandteile einer ODBC-Architektur Treiber I Ein-Stufen-Treiber Ermöglicht Zugriff auf Dateibasis Datenbank und Treiber befinden sich auf demselben Rechner Treiber enthält komplette SQL-Datenbankengine: übernimmt Parsing sowie Optimieren & Ausführen von SQL- Anweisungen Mehrbenutzerzugriff und Transaktionsverarbeitung werden nicht unterstützt
ODBC ODBC Bestandteile einer ODBC-Architektur Treiber II Zwei-Stufen-Treiber Ermöglich DB-Zugriff in klassischen Client/Server-Systemen Drei Derivate: Kommunikation über das DBMS-Datenprotokoll Ersatz für die Client-Seite der proprietären DBMS-Software (MS SQL) Abbildung zwischen ODBC-API und DBMS-API Übersetzer zwischen APIs (Oracle) Zwischenschaltung von Middleware falls DBMS-Hersteller keinen ODBC-Treiber hat (optional auch Bereitstellung des Netzwerkprotokolls) Übersetzung von ODBC-SQL in jeweiliges DBMS-SQL Parsing, Syntax- & Semantikanalyse
ODBC ODBC Bestandteile einer ODBC-Architektur Treiber III Drei-Stufen-Treiber (Gateway Driver) Einsatz eines Verbindungsrechners zwischen Client und Server Performancegewinn durch Auslagerung des Clients (bspw. Nutzung der Client-CPU für Cursorverwaltung) Gateway hält üblicherweise Verbindungen zu mehreren Servern Clients müssen nur einen Treiber verwenden Vereinfachung der Administration Verlagerung der Administration auf den Gateway-Rechner Theoretisch können weitere Stufen nachgeschaltet werden
ODBC ODBC ODBC... ODBC... JDBC ODBC... ODBC.... JDBC... JDBC... JDBC...
... verschiedene JDBC-Treibertypen JDBC-ODBC-Bridge wird von SUN mitgeliefert client-seitige Installation von ODBC-Treiber erforderlich Plattformeigene Treiber: native-api partly JAVA driver client-seitige Installation eines DB-spezifischen Treibers erforderlich bspw. Oracle Thick Driver (basiert auf SQL*Net) Universelle Treiber: net-protocol fully JAVA driver Middleware-Server vermittelt auf verschiedene DBMS bspw. Symantec dbanyware Direkte JDBC-Treiber: native-protocol fully JAVA driver baut DB-Client/Server-Protokoll via JAVA TCP/IP Sockets auf (Package java.net) bspw. Oracle Thin Driver (simuliert SQL*Net)
... verschiedene JDBC-Treibertypen JDBC-ODBC-Bridge 1 4 Direkte JDBC-Treiber net-protocol fully JAVA technology-enabled driver 3 Universelle JDBC-Treiber native-protocol fully JAVA technology-enabled driver Plattformeigene JDBC-Treiber native-api partly JAVA technology-enabled driver 2
JDBC-ODBC-Bridge (Typ 1) JDBC Driver Manager Client Applet-1 Applet-2 Applet-3 Web-Server JDBC/ODBC Bridge Applet ODBC-Driver-1 ODBC-Driver-2 ODBC-Driver-Manager DB-Server A JDBC-ODBC bridge provides JDBC-API access via one or more ODBC drivers. Note that some ODBC native code and in many cases native client databases code must be loaded on each client machine that uses this type of driver. Hence this kind of driver is generally most appropriate when automatic installation and downloading of a JAVA technology application is not important.
Plattformeigene JDBC-Treiber (Typ 2) JDBC Driver Manager Client Applet-1 Applet-2 Applet-3 Web-Server Oracle Thick JAVA Driver Applet SQL*Net SQL*Net DB-Server A native-api partly JAVA technology-enabled driver converts JDBC calls into calls on the client API for ORACLE, Sybase, Informix, DB2, or other DBMS. Note that like the bridge driver, this style of driver requires that some binary code be loaded on each client machine. Hence this kind of driver is generally most appropriate when automatic installation and downloading of a JAVA technology application is not important.
Universelle JDBC-Treiber (Typ 3) <<download>> JDBC Driver Manager dbanywhere JAVA Client Applet Client Applet-1 Applet-2 Applet-3 dbanywhere Server Web-Server DB-Server A net-protocol fully JAVA technology-enabled driver translates JDBC API calls into a DBMS independent net protocol which is then translated to a DBMS protocol by a server. This net server middleware is able to connect all of ist JAVA technology-based clients to many different databases. The specific protocol used depends on the vendor. In general, this is the most flexible JDBC API alternative. It is likely that all vendors of this solution will provide products suitable for Intranet use. In order for these products to also support Internet access they must handle the additional requirements for security, access through firewalls, etc., that the Web imposes. Several vendors are adding JDBC technology-based drivers to their existing database middleware products.
Direkte JDBC-Treiber (Typ 4) <<download>> JDBC Driver Manager Client Applet-1 Applet-2 Applet-3 Web-Server Oracle Thin JAVA Driver Applet DB-Server A native-protocol fully JAVA technology-enabled driver converts JDBC technology calls into the network protocol used by the DBMSs directly. This allows a direct call from the client machine to the DBMS server and is a practical solution for Intranet access. Since many of these protocols are proprietary the database vendors themselves will be the primary source for this style of driver. Several database vendors have these in progress.
JDBC Grundlagen Prinzipielles Vorgehen Laden eines passenden DB-Treibers (z.b. Oracle Thin Driver) und Treiberregistrierung Aufbau der Verbindung (Connection) Erzeugung eines kapselnden Objektes (das das Statement- Interface implementiert) Ausführung einer Anweisung (DML+DDL) Bei DML: Verarbeiten des Ergebnisses (ResulSet; stellt u.a. Cursor bereit) Schließen des ResultSets Schließen des Statement-Objektes Schließen der Verbindung
JDBC-Beispiel (1/3) Tabelle Nodes CREATE TABLE Nodes ( NodeID VARCHAR(128), NodeName VARCHAR(128) ) Laden eines passenden DB-Treibers (z.b. Oracle Thin Driver) und Aufbau der Verbindung try { Class.forName ("oracle.jdbc.driver.oracledriver"); } catch (ClassNotFoundException e) { System.out.println ("Treiber nicht geladen!"); e.printstacktrace(); } Connection con = DriverManager.getConnection( jdbc:oracle:thin:@da.oder.dort:1521:oradb8, UName, pwd );
JDBC-Beispiel (2/3) private void doquery(string selectstatement) throws SQLException, SQLWarning { String columnname; int columncount; Object value; 1 2 3 // create a statement object so we can submit SQL statements Statement stmt = con.createstatement(); // submit a query, creating a result object ResultSet rs = stmt.executequery(selectstatement); // get metadata ResultSetMetaData meta_data = rs.getmetadata(); columncount = meta_data.getcolumncount();...
JDBC-Beispiel (3/3) } while (rs.next()) { // advance database cursor for (int i=1; i<=columncount; i++) { value = rs.getobject(i); // also: double d = rs.getdouble(i); // String s = rs.getstring(i); columnname = meta_data.getcolumnname(i); System.out.println( columnname.touppercase() + : + value); } // End For } // End While // clean up, release resources rs.close(); stmt.close();
JDBC: INSERT, UPDATE etc. Neben SELECT werden auch andere Anweisungen unterstützt (SELECT, UPDATE, DELETE, DDL-Anweisungen) Die Methode int executeupdate(string statement) liefert als Ergebniswert die Anzahl der betroffenen Tupel bspw.: boolean b = s.execute( INSERT INTO Person (PID, VNAME, NNAME, PLZ, ORT) VALUES (1119, Frank, Köster, 26121, Oldenburg ) );... int res = s.executeupdate( DELETE FROM Person WHERE PID= +pidtf.gettext());... sqlstr = UPDATE Person SET VNAME= Frank, LNAME= Köster, PLZ= 26409, ORT= Wittmund WHERE PID=1119 ; res = s.executeupdate(sqlstr);
JDBC: Prepared & Callable Statements Problem: Anweisungen (Statements) werden immer wieder neu übersetzt Prepared Statements als effizientere Alternative: Zum Beispiel: String insstr = INSERT INTO Person VALUES(?,?) ); PreparedStatement updatestmt; updatestmt = con.preparestatement(insstr); updatestmt.setint(1,1119); updatestmt.setstring(2, Frank); int i = updatestmt.executeupdate(); Anmerkung: Nicht alle DBMS erlauben Parametrisierung von Tabellennamen. Callable Statements ermöglichen den Aufruf von gespeicherten Prozeduren mit IN und OUT Parametern
JDBC: Transaktionssteuerung (1/3) Nach dem Aufbau einer JDBC-Verbindung ist die Datenbank im Auto-Commit-Modus. Es wird jede einzelne Anweisung als Transaktion betrachtet und automatisch bestätigt. Die Transaktionssteuerung erfolgt über die Methoden commit() und rollback() des Interfaces java.sql.connection Weitere Methoden sind getautocommit() und setautocommit(boolean b) Auto-Commit bedeutet hierbei, dass nach jeder Anweisung automatisch ein commit erfolgt
JDBC: Transaktionssteuerung (2/3) Es gibt verschiedene Transaktionsmodi int mode = con.gettransactionisolation() TRANSACTION_READ_UNCOMMITED erlaubt Zugriff auf noch nicht bestätigte Daten ( dirty reads ) TRANSACTION_READ_COMMITED nur lesen geschriebener Daten, das unrepeatable reads -Problem kann auftreten TRANSACTION_REPEATABLE_READS innerhalb einer Transaktion erneut gelesene Daten bleiben gleich; jedoch kann das Phantom-Problem auftreten: bei erneutem Lesen können z.b. zusätzliche Datensätze auftauchen TRANSACTION_SERIALIZABLE höchste Stufe volle Transaktionsunterstützung
JDBC: Transaktionssteuerung (3/3) Dirty Read: Unrepeatable read: Phantom: T1: write(x) T2: read(x) T1: abort T1: read(x) T2: write(x) T2: end transaction T1: read(x) T1: read range [x - y] T2: insert z, x < z < y T2: end transaction T1: read range [x - y] Read von T2 ist ungültig T1 hat zwei unterschiedliche Werte für X gelesen z ist ein Phantom- Item
JDBC: Meta-Daten Nutze ResultSet, um Daten über Ergebnisse einer Anfrage zu erhalten: ResultSetMetaData meta_data = rs.getmetadata(); columncount = meta_data.getcolumncount(); Nutze DatabaseMetaData, um über umfangreiche Methoden auf Detail wie Schema, Zugriffsrechte usw. eines DBMS abfragen zu können: DatabaseMetaData dbmd = con.getmetadata(); ResultSet rset = dbmd.getcatalogs(); int mv = dbmd.getdrivermajorversion();
Abbildung von JDBC-/SQL-Datentypen in JAVA... JDBC/SQL Typ CHAR,VARCHAR,LONGVARCHAR NUMERIC,DECIMAL BIT TINYINT SMALLINT INTEGER BIGINT REAL FLOAT,DOUBLE BINARY,VARBINARY,LONGVARBINARY DATE TIME TIMESTAMP JAVA Typ java.lang.string java.math.bigdecimal boolean byte short int long float double byte[] java.sql.date java.sql.time java.sql.timestamp
Datenbanksysteme SS 2007 Ende von Kapitel 8a: Datenbankapplikationen