Teil 1 herunterladen - Universität Osnabrück
Transcription
Teil 1 herunterladen - Universität Osnabrück
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) Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] 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)? Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] 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 ... Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] ODBC ODBC → Die Rolle von ODBC in einer komplexen Architektur ... Excel Access Lohnabrechnung Server Client ODBC Treiber Manager Oracle Treiber MS SQL Server Treiber SQL*Net Net-Lib Xbase Treiber Informix Treiber EDA/SQL Treiber DB2 Gateway Treiber Net-Lib EDA-Link Net-Lib Net-Lib EDA-Link Net-Lib dbf Files SQL*Net Net-Lib Gateway Oracle7 MS SQL Server Informix Online IBM DB2 Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] 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 nächste Folie → delegiert Funktionsaufrufe an zuständige Treiber → 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) Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] 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 ... Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] 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 SQLAnweisungen → Mehrbenutzerzugriff und Transaktionsverarbeitung werden nicht unterstützt Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] 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 Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] 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 Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] ODBC ODBC ODBC ... ODBC ... ODBC ... JDBC ... ODBC. JDBC ... JDBC ... JDBC ... Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → ... 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) Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → ... verschiedene JDBC-Treibertypen JDBC-ODBC-Bridge 4 1 Direkte JDBC-Treiber net-protocol fully JAVA technology-enabled driver … Plattformeigene JDBC-Treiber 2 native-API partly JAVA technology-enabled driver … 3 Universelle JDBC-Treiber native-protocol fully JAVA technology-enabled driver … Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → JDBC-ODBC-Bridge … (Typ 1) Client Applet-1 Web-Server Applet-2 Applet-3 JDBC Driver Manager JDBC/ODBC Bridge Applet ODBC-Driver-1 ODBC-Driver-2 DB-Server ODBC-Driver-Manager 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. Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → Plattformeigene JDBC-Treiber … (Typ 2) Client Applet-1 Web-Server Applet-2 Applet-3 JDBC Driver Manager 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. Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → Universelle JDBC-Treiber … (Typ 3) <<download>> Client Web-Server Applet-1 Applet-2 Applet-3 JDBC Driver Manager dbAnywhere JAVA Client Applet dbAnywhere 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. Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → Direkte JDBC-Treiber … (Typ 4) <<download>> Client Applet-1 Web-Server Applet-2 Applet-3 JDBC Driver Manager Oracle Thin JAVA Driver DB-Server Applet 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. Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC 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 StatementInterface 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 Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → 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“ ); Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → JDBC-Beispiel (2/3) private void doQuery(String selectStatement) throws SQLException, SQLWarning { String columnName; int columnCount; Object value; 1 // create a statement object so we can submit SQL statements Statement stmt = con.createStatement(); 2 // submit a query, creating a result object ResultSet rs = stmt.executeQuery(selectStatement); 3 // get metadata ResultSetMetaData meta_data = rs.getMetaData(); columnCount = meta_data.getColumnCount(); ... Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → 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(); } Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → 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); Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → 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 Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → 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 Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → 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 … Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → JDBC: Transaktionssteuerung (3/3) Dirty Read: Unrepeatable read: Phantom: T1: write(X) T1: read(X) T1: read range [x - y] T2: read(X) T2: write(X) T2: insert z, x < z < y T1: abort T2: end transaction T2: end transaction T1: read(X) T1: read range [x - y] ⇒ Read von T2 ist ungültig ⇒ T1 hat zwei unterschiedliche Werte für X gelesen ⇒ z ist ein PhantomItem Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → 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(); … Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] JDBC JDBC – JAVA Database Connectivity → Abbildung von JDBC-/SQL-Datentypen in JAVA ... JDBC/SQL Typ JAVA Typ CHAR,VARCHAR,LONGVARCHAR java.lang.String NUMERIC,DECIMAL java.math.BigDecimal BIT boolean TINYINT byte SMALLINT short INTEGER int BIGINT long REAL float FLOAT,DOUBLE double BINARY,VARBINARY,LONGVARBINARY byte[] DATE java.sql.Date TIME java.sql.Time TIMESTAMP java.sql.Timestamp Dr. Frank Köster · Universität Oldenburg · Fakultät II · Department für Informatik · Abteilung Informationssysteme · Escherweg 2 · 26121 Oldenburg · eMail: [email protected] Datenbanksysteme SS 2007 Ende von Kapitel 8a: Datenbankapplikationen