Datenbank und Informationssysteme Inhaltsverzeichnis 1 Programmierung von Datenbankzugriffen 1.1 Architektur des SQL/CLI am Beispiel JDBC . . . . . 1.2 SQl-Anweisungen und Ergebnismengen . . . . . . . . . 1.3 Metainformationen und adaptives Programmieren . . . 1.4 Architektur von ADO.NET . . . . . . . . . . . . . . . 1.5 Speicherresidente Datenbankstrukturen mit ADO.NET 1.6 Objekt-Relationales Mapping am Beispiel Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 10 13 16 17 20 2 Transaktionen und Nebenläufigkeitskontrolle 2.1 Eigenschaften und Verwendung von Transaktionen 2.2 Serialisierbarkeit und Nebenläufigkeitskontrolle . . 2.3 Isolationslevel in SQL-Datenbanksystemen . . . . . 2.4 Strategien der Nebenläufigkeitskontrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 23 23 23 23 . . . . . 23 23 23 23 23 23 3 Verteilte Datenbanken 3.1 Architektur verteilter Datenbanken . . . . . 3.2 Datenspeicherung in verteilten Datenbanken 3.3 Verteilte Anfragen . . . . . . . . . . . . . . 3.4 Änderung verteilter Daten und Replikation 3.5 Verteilte Transaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Datenbanksicherheit und Autorisierung 23 4.1 Autorisierung und Zugriffskontrolle . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.2 Techniken zum Recovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5 Datenanalyse zur Entscheidungsfindung 24 5.1 Data-Warehouses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5.2 Data-Mining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1 Rami Swailem FH Gießen-Friedberg 6 Neue Datenbanktechnologien 6.1 XML und Datenbanken . . 6.2 Temporale Datenbanken . . 6.3 Geografische Datenbanken . 6.4 Logik-basierte Datenbanken DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET WS 06/07 DB2 Mitschrift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 24 24 24 24 Seite 2 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift 1 Programmierung von Datenbankzugriffen Situation: *S Backend Frontend Anwendung DB-Server SQL myProg *C Ergebnismengen DBMS Daten *R Beispiel 1.1 Die Grundstruktur des Datenbankzugriffs mit JDBC besteht in sechs Schritten. Listing 1: JDBC-Abfrage 1 import j a v a . s q l . ∗ ; 3 public c l a s s BasicJDBC { 5 7 public s t a t i c void main ( S t r i n g [ ] a r g s ) { Connection con = null ; Statement stmt = null ; R e s u l t S e t r s = null ; 9 try { 11 DB2 /∗∗ S c h r i t t 1 : Treiber r e g i s t r i e r e n ∗/ C l a s s . forName ( " sun . j d b c . odbc . JdbcOdbcDriver " ) ; 13 /∗∗ S c h r i t t 2 : Connection zur Datenbank h e r s t e l l e n ∗/ 15 con = DriverManager . g e t C o n n e c t i o n ( " j d b c : odbc : azamon " , " d i s " , " ∗∗∗∗∗ " ) ; } Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET 17 /∗∗ S c h r i t t 3 : Satement erzeugen ∗/ 19 stmt = con . c r e a t e S t a t e m e n t ( ) ; 21 /∗∗ S c h r i t t 4 : Anweisung d i r e k t ausfuehren ∗/ r s = stmt . executeQuery ( " s e l e c t author , t i t l e from Books " ) ; 23 /∗∗ S c h r i t t 5 : Ergebnis verwenden ∗/ 25 27 while ( r s . next ( ) ) { System . out . p r i n t l n ( r s . g e t S t r i n g ( " a u t h o r " ) + " " + rs . getString ( " t i t l e " ) ); WS 06/07 Seite 3 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift } 29 31 } catch ( E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e ( ) ; } try { finally { /∗∗ S c h r i t t 6 : Nicht mehr benoetigte Resourcen f r e i g e b e n ∗/ i f ( r s != null ) r s . c l o s e ( ) ; i f ( stmt != null ) stmt . c l o s e ( ) ; i f ( con != null ) con . c l o s e ( ) ; 33 35 } catch ( E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e ( ) ; } 37 } 39 } 41 } Es sind sechs Schritte, die die Grundstruktur eines JDBC-Programms bilden: 1. Treiber registrieren Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") Mit der klassenglobalen Funktion forName von Class wird das Class-Objekt Jdbc-OdbcDriver erzeugt, in unserem Fall die so genannten JDBC-ODBC-Bridge. Diese tr“agt sich im statischen Treiberregister von JDBC ein. Mit diesem Schritt eröffnen wir uns den Zugriff auf ein Objekt, den Treiber, der den Datenzugriff auf eine Datenquelle durchfhren kann. 2. Connection zur Datenbank herstellen Connection con = DriverManager.getConnection() Der JDBC-Treibermanager DriverManager ist ein Singleton, sein Konstruktor ist privat und alle seine Methoden sind statisch, also klassenglobal. Er verwendet die JDBC URL (in unserem Fall jdbc:odbc:azamon), bietet sie jedem registrierten Treiber an, bis sich der erste findet, der zu dieser URL eine Connection herstellen kann. Der Treiber instantiiert ein Objekt der Klasse Connection, das der Treibermanager der Anwendung bergibt. (Danach spielt der Treibermanager gar keine Rolle mehr, es ist das Connection-Objekt, das für die Anwendung die Verbindung zur Datenquelle repräsentiert.) 3. Statement erzeugen DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET Statement stmt = con.createStatement() Das Objekt der Klasse Statement wird von der Connection erzeugt; es wird verwendet, um SQL-Anweisungen an die Datenquelle zu richten. 4. Anweisung ausfhren und Ergebnismenge erzeugen ResultSet rs = stmt.executeQuery(...) Die SQL-Anweisung wird ausgefhrt und die Methode executeQuery liefert eine Referenz auf die Ergebnismenge zurck. Die Klasse ResultSet repräsentiert die Ergebnismenge einer SQL-Anweisung und hat Methoden, mit denen der (implizite) Cursor auf der Ergebnismenge bewegt wird und mit denen die Werte aus der Ergebnismenge gelesen werden. Im einfachsten (und im Default) Fall hat das Objekt rs einen Cursor, der schrittweise vorwärts ber die Zeilen des Ergebnisses bewegt werden kann. WS 06/07 Seite 4 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift 5. Ergebnis verwenden while ( rs.next() ) {... Die Methode next() der ResultSet positioniert den Cursor zunächst auf die erste Zeile der Ergebnismenge, und bewegt ihn dann mit jeder Iteration ber die folgenden Zeilen. Mit den Methoden getXXX(), in unserem Fall getString(), können die Werte der Spalten aus der aktuellen Zeile der Ergebnismenge gelesen werden. Als Parameter der GetMethoden kann man den Namen der Spalte oder auch ihre Position (bei 1 beginnend) angeben. JDBC ist sehr komfortabel was die Konvertierung der Datentypen angeht – in der JDBC-Dokumentation geben Listen Auskunft ber die möglichen Konversionen. 6. Nicht mehr benötigte Resourcen freigeben rs.close() ... Sicherlich würde auch schlussendlich der GarbageCollector von Java die Objekte vernichten und in diesem Zuge die entsprechende Methode close() aufrufen. Auch wenn ein bergeordnetes Objekt vernichtet wird, ruft JDBC die entsprechenden Funktionen der untergeordneten Objekte auf. Herr Renz hat gleichwohl bewusst im Beispiel die ganze Reihung der CloseMethoden explizit angegeben, um auf folgenden Punkt aufmerksam zu machen: Die GarbageCollection von Java kann keine Ahnung davon haben, wie externe Resourcen verwaltet werden, Resourcen, die die Datenbank oder etwa ein ODBC-Treiber bereitstellt. Infolgedessen kann es auch keinen Mechanismus geben, der den geeigneten Zeitpunkt automatisch ermittelt, zu dem diese Resourcen freigegeben werden sollten. Es ist also guter Stil in einem JDBC-Programm, nicht mehr benötigte Resourcen selbst freizugeben. 1.1 Architektur des SQL/CLI am Beispiel JDBC Zwei grundlegende Techniken des Zugriffs: 1. SLI: Statement Level Interface (embedded/eingebettetes SQL) 2. CLI: Call LevelInterface SLI am Beispiel SQLJ: Prinzip: SQL-Anweisung als „Teil“ unseres Codes Listing 2: sli-Beispiel.java DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET 1 3 5 ... s t r i n g i s b i n = new s t r i n g ( " 3 − 4 5 8 . . . " ) ; . . . #s q l {SELECT author , t i t l e INTO : a u t h o r : t i t l e FROM Books WHERE i s b n =: i s b n } .... Dieser Code steht in einer „.SQLJ“-Datei. Der SQLJ-Translator erzeugt daraus eine .java- und eine .ser-Datei. Der Java-Compiler erzeugt aus dem .java-Code eine ausfhrbare Java-Klasse .class. Bei der Ausfhrung greift die Klassendatei auf den vorbereiteten SQL-Ausfhrungsplan aus der .ser-Datei zu, der in der Datenbank vorgehalten wird ⇒ statisches SQL. WS 06/07 Seite 5 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift file.sqlj SQL-Translator file.java file.ser javac enthält vorcompilierten Zugriffsplan des DBMS für alle #SQL-Anweisungen in file.sqlj file.class file.ser SQLJ Run-Time Statisches SQL Erstellen des Zugriffsplan des DBMS zur Compilierzeit. Vorteil: Zugriffsplan steht bei der Ausfhrung schon fertig zur Verfgung, Ausfhrung dadurch etwas schneller. Nachteil: Hohe Kopplung an die Datenbank, Datenbank muß beim Compilieren verfgbar sein. Dynamisches SQL Erstellen des Zugriffsplans des DBMS zur Ausfhrungszeit. Nachteil: Zugriffsplan muß zur Ausfhrungszeit berechnet werden. (kann optimiert werden) Vorteil: Unter Umständen kann das DBMS jederzeit ohne Anpassung des Codes gewechselt werden. Außerdem Vorteil SLI: Meist statisches und dynamisches SQL möglich. CLI: Call Level Interface Beispiel: ODBC C/C++ JDBC Java ADO.NET C# sind Implementierungen von SQL/CLI = Teil des SQL-Standards. DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET Aufbau JDBC: • Java-Anwendung kommuniziert mit (DBMS-unabhängigem) JDBC-Treibermanager. (java.sql.*) • Treibermanager kommuniziert mit DBMS-abhängigem JDBC-Treiber. • Spezifischer JDBC-Treiber kommuniziert mit seinem DBMS. WS 06/07 Seite 6 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift Die Java-Anwendung sendet SQL-Anweisungen an JDBC und erhält Ergebnismengen zurck. Java-Anwendung SQL java.sql.* Ergebnismengen DBMS-unabhängig JDBC (Treibermanager) JDBCTreiber Oracle JDBCTreiber mySQL JDBCTreiber DB2 DBMS-spezifisch DBServer DBServer DBServer Oracle mySQL DB2 Aufbau ODBC äuivalent. Problem: SQL-Dialekte in den DBMS machen die DBMS-unabhängikeit wieder schwieriger, Dialekte und spezielle Features sollten nach Möglichkeit vermieden werden. 4 Arten von JDBC-Treibern: Die Unterschiede ergeben sich durch die verschiedenen Typen der JDBC-Treiber, die in der Abbildung skizziert sind. DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET WS 06/07 Seite 7 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift Java-Anwendung JDBC-Treibermanager Client Client JDBCODBCBridge Naiver APITreiber ODBC ClientDB-Lib Treiber vom: ClientDB-Lib Typ 1 Client JDBC NetTreiber Client Naiver ProtokollTreiber DBMiddleware Typ 2 Typ 3 Typ 3 Typ 1: JDBC-ODBC-Bridge (sun.jdbc.odbc.JdbcOdbcDriver) Typ 2: Native API-Treiber Typ 3: JDBC-Net-Treiber Typ 4: Nativer Protokoll-Treiber Typen von JDBC-Treibern 1. Treiber vom Typ 1 implementieren die JDBC API durch das Mapping der Funktionen auf eine andere SQL CLI, die nicht in Java geschrieben ist. In der Regel handelt es sich dabei natrlich um ODBC, d.h. Treiber vom Typ 1 sind eine JDBC-ODBC-Bridge. Ein solcher Treiber ist Bestandteil von SUNs JDK. Der Vorteil dieser Technik besteht darin, dass man vorhandene und installierte ODBC-Funktionalität sofort nutzen kann – es stand somit von der ersten JDBC-Version an der Zugriff auf nahezu alle denkbaren Datenquellen zur Verfgung. Der große Nachteil liegt darin, dass ODBC nicht für Applets genutzt werden kann, weil ODBC die Sicherheitsrestriktionen für Applets verletzt. DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET 2. Treiber vom Typ 2 beruhen auf den Datenbankspezifischen Schnittstellen, d.h. sie verwenden die (in der Regel in C geschriebenen) Low-Level-APIs des jeweiligen DatenbankHerstellers. Bezglich der Applets verbessert sich die Lage gegenber der JDBC-ODBC-Bridge dadurch natrlich nicht. 3. Treiber vom Typ 3 sind rein in Java geschrieben und kommunizieren ber ein Datenbankunabhängiges Netzprotokoll mit einer Middleware-Komponente, die auf dem Server installiert ist. Diese Komponente fhrt dann den eigentlichen DatenbankZugriff durch. Um ein Beispiel zu nennen: Easysoft bietet eine JDB-CODBC-Bridge vom Typ 3 an. Auf Client-Seite wird ein reiner Java-Treiber verwendet, der mit dem UDP-Protokoll WS 06/07 Seite 8 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift (user datagram protocol) via TCP/IP mit dem Server spricht. Serverseitig werden nun die Anfragen des JDBC-Treibers in ODBC-Anfragen transformiert und ODBC fhrt dann den eigentlichen Datenzugriff weiter. 4. Treiber vom Typ 4 sind rein in Java geschrieben und kommunizieren mit dem Datenbank-Server ber sein Netzprotokoll. D.h. der Java-JDBC-Treiber tritt an die Stelle des Datenbank-Clients und wickelt die Kommunikation mit dem Server direkt ab. Ein Beispiel für einen Treiber dieses Typs ist jConnect von Sybase. Der JDBC-Treiber jConnect verwendet das Protokoll TDS (tabular data stream) von Sybase und richtet so seine Anfragen direkt an den Datenbank-Server. Treiber vom Typ 4 versprechen die beste Performance. Treibermanager • Registrieren und Laden von Treibern • Herstellen der Verbindung zur DB • Konfiguration der Verbindung • Delegation an JDBC-Treiber 1. Registrieren und Laden von Treibern Methode 1: Explizites Laden der Treiberklasse: 1 C l a s s . forName ( o r g . p o s t g r e s . D r i v e r ) Methode 2: properties-Datei: 1 j d b c . d r i v e r s=o r g . p o s t g r e s . D r i v e r , . . . Methode 3: Systemeigenschaft (Parameter beim Aufruf): 1 j a v a −D j d b c . d r i v e r s = . . . . MyClass Methode 4: (neu in JDBC 4.0) automatisches Laden bei getConnection anhand URL 2. Herstellen der Verbindung zur Datenbank Methode 1: DriverManager.getConnection(url,uid,pwd) DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET jdbc:<subprotocol>:<subname> z. B.: 1 j d b c : odbc : azamon /∗= DSN i n ODBC∗/ j d b c : p o s t g r e s q l : / / h o s t : p o r t / d a t a b a s e /∗= URL d e r DB a u f postgreSQL− S e r v e r ∗/ Methode 2: Verwenden einer DataSource Vorteil: Nur der Name muß bekannt sein, keine Ports etc.. WS 06/07 Seite 9 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift Schritt 1: Der Anbieter einer Datenquelle registriert DataSource bei JNDI← Namensdienst Schritt 2: Der Verwender holt sich eine Connection bei der DataSource 2 DataSource ds = ( DataSource ) new I n i t i a l C o n t e x t ( ) . lo ok up ( "Name d e r Datenquelle " ) ; Connection con = ds . g e t C o n n e c t i o n ( ) ; 1.2 SQl-Anweisungen und Ergebnismengen s e l e c t author , t i t l e from Books where ISBN= ’ 3 . . . ’ 1 SQL-Gramatik Parsen Systemkatalog Validieren Optimieren 2 UTE EXEC T C DIRE 3 ARE PREP ED STOR DUE PROC ugen e z r e RE t t aufzei ur Laufzei zur L z binärer Zugriffsplan erzeugen Zugriff durchführen UTE EXEC t, aufzei zur L h durchac mehrf ar b r füh ED STOR DUE C O PR en rwend e v E R DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET Methode 1: 1 Statement stmt = con . c r e a t e S t a t e m e n t ( ) ; R e s u l t S e t r s = stmt . executeQuery ( " s e l e c t author , t i t l e from Books where ISBN = ’ 3 . . . ’ " ) ; Methode 2: Parametrisierte Anweisung Pr eparedStatement pstmt = con . p r e p a r e S t a t e m e n t ( " s e l e c t author , t i t l e from Books where ISBN = ? " ) ; WS 06/07 Seite 10 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift PreparedStatement wird vom DBMS bei prepareStatement(...) vorbereitet/bearbeitet und zwischengespeichert 1 pstmt . s e t S t r i n g ( 1 , " 3 − 1 2 3 . . . " ) ; R e s u l t S e t r s = pstmt . executeQuery ( ) ; Methode 3: 2 CREATEE PRODUCERE readbook @isbn char ( 1 3 ) AS s e l e c t author , t i t l e from Books where i s b n =@isbn ; 4 C a l l a b l e S t a t e m e n t cstmt = con . p r e p a r e C a l l ( " { c a l l readbook ( ? ) } ) ; 6 R e s u l t S e t r s = cstmt . executeQuery ( ) ; DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET WS 06/07 Seite 11 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift Arten von Anweisungen a) Abfragende Anweisung – liefert ResultSet 1 " select . . . " R e s u l t S e t r s = stmt . executeQuery ( . . . ) ; b) Modifizierende Anweisung – liefert Zahl der veränderten Zeilen 1 3 " insert . . . " " update . . . " " delete . . . " i n t rows = stmtm . executeUpdate ( . . . ) ; DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET c) Beliebige Anweisung – liefert ein Boolean 1 3 5 " . . . " boolean t o r f = stmt . e x e c u t e ( . . . ) ; // true or f a l s e wenn t o r f==true // Ergebnis i s t ResultSet r s . stmt . g e t R e s u l t S e t ( ) ; wenn t o r f==f a l s e // Ergebnis i s t i n t r s . getUpdateCount ( ) ; Ergebnismengen Relationales Modell: Tabellen/Relationen enthalten Zeilen von Werten. WS 06/07 Seite 12 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift OO-Programmiersprachen: Variablen, Objekte mit Attributen(Variablen), Datenstrukturen,... -> Konzeptbruch / "paradigma mismatch" Programmiersprache Ein Resultset rs repräsentiert einen Cursor auf eine Zeile der Ergebnismenge (Relation) aus dem DBMS. Die Ergebnismenge muß nicht zwangsläufig bei executeQuery sofort vollständig „materialisiert“ sein, Zeilen können bei Bedarf nachgeladen werden. Metainformationen über die Ergebnismenge stehen in den SQL-Deskriptoren, beginnend bei 1 für Spalte 1. Arten von Ergebnismengen 1. Scroll-Eigenschaften • TYPE_FORWARD_ONLY (Abrufen nur vorwärts, schnell und einfach aber beschränkt) • TYPE_SCROLL_INSENSITIVE (Insensitive: Änderungen während der Verarbeitung des Results bleiben unsichtbar) • TYPE_SCROLL_SENSITIVE (Sensitive: Alle Änderungen während der Verarbeitung des Results wirken sich sofort aus) 2. Änderbarkeit • CONCUR[RENCY]_READ_ONLY (Cursor hat nur Lesezugriff) • CONCUR[RENCY]_UPDATEABLE (An der Position des Cursor können Daten verändert werden) 1+2 wird angegeben bei createStatement. 1.3 Metainformationen und adaptives Programmieren Fragestellungen: • nicht nur Nutzdaten, sondern Informationen über die Nutzdaten über das Datenbanksystem • Informationen über die Fähigkeiten eines DBMS, um diese in einer Anwendung berücksichtigen zu können DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET 1. Fehler- und Statusinformationen Konzept der DB: SQL Communication Area (Datenstrukturen für Fehler- und Statusmeldungen) • standardisierte Fehlercodes (in SQL) • DBMS-spezifische Fehlermeldungen Konzept in JDBC: SQLException ex, enthält WS 06/07 Seite 13 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift • Beschreibung des Fehlers: ex.getMessage(); • SQL-Status: ex.getSQLState(); • Meldung der Datenquelle: ex.getErrorCode(); • Kette der (bei der DB) anliegenden Meldungen: ex.getNextException(); Konzept in ADO.NET: DataException de, enthält • Beschreibung: de.getMessage(); • Reihe von abgeleiteten Klassen wie z.B. – DuplicateNameException – InvalidExpressionException – ··· Besonderheiten in ADO.NET: Connection erzeugt ein Event InfoMessage, korrespondierender Delegat behandelt das Event (entspricht Fehlermeldung). 2. Informationen über einzelne Werte Konzept der DB: Indikatorvariable (wird intern vom Treiber bei der Kommunikation mit dem DBMS verwendet, insb. für NULL-Werte interessant) Konzept in JDBC: ResultSet rs • rs.wasNull() ∼ = die zuletzt aus rs gelesene Info war ein NULL-Wert. Konzept in ADO.NET: DataReader rs • dr.IsDBNull(int i); // int i: Index der Spalte) 3. Aufbau einer Ergebnismenge Konzept der DB: SQLDeskriptor • SQLDeskriptor beschreibt eine Spalte einer Ergebnistabelle: Spaltenname, Datentyp, ··· • pro Spalte ein SQLDeskriptor, Zählung startet bei 1 DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET Konzept in JDBC: 2 4 ResultSetMetaData rsmd ; rsmd = r s . getMetaData ( ) ; // Meta−Daten d i e s e s ResultSets i n t rsmd . getColumnCount ( ) ; // Zahl der Spalten i n t rsmd . getColumnType ( i n t i ) ; // Typ der Spalte i , beginnend bei 1 s t r i n g rsmd . getColumnName ( i n t i ) ; // Name der Spalte Konzept in ADO.NET: WS 06/07 Seite 14 Rami Swailem FH Gießen-Friedberg 1 3 DB2 Mitschrift DataReader dr ; dr . ExecuteReader ( ) ; dr . Fiel dCount ; // Zahl der Spalten des Ergebnis dr . GetName ( i n t i ) ; // Name der Spalte i , beginnend bei 0 DataTable dr . GetSchemaTable ( ) ; Eine Zeile der Schema-Tabelle beschreibt eine Spalte der (Nutzdaten-)Tabelle. 4. Informationen über die Datenquelle Konzept der DB: Systemkatalog • Informationen, die die JDBS-Treiber bzw. ADO.NET DataProvider liefern Konzept in JDBC: DatabaseMetaData dbmd = con.getMetaData(); • allgemeine Informationen: getURL(), getDatabaseProductVersion(); • Eigenschaften der Datenquelle: supportsFullOuterJoin(); supportsANSI92EntryLevelSQL(); • Grenzwerte in der Datenquelle: getMaxConnections(); getMaxRowSize(); • Systemkatalog: getTables(); getPrimaryKeys(); ... Konzept in ADO-ET (2.0) DataTable dt = con.getSchema(); //DataTable enthält Infos DataTable tables = con.getSchema("TABLES"); Adaptives Programmieren Ziele: 1. Programmcode soll für verschiedene DBMS funktionieren. 2. Programmcode soll fähig sein, spezielle Eigenschaften eines DBMS auszunutzen. Lösung: Adaptives Programmieren = verwende Metainformationen über die Datenquelle um den Zugriff zu steuern. Bsp in JDBC: (Technik = adaptives Programmieren) DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET 2 4 6 8 . . . DatabaseMetaData dbmd = con . getMetaData ( ) ; ... i f (dbmd . s u p p o r t s F u l l O u t e r J o i n ( ) ) { . ... // f u l l outer j o i n s } else { ... // g e s c h a c h t e l t e S e l e c t s ( oder andere " Notloesung " ) } WS 06/07 Seite 15 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift 1.4 Architektur von ADO.NET • Grundkonzept von ADO.NET: Trennung des Datenzugriffs von der Datenmanipulation (MS) • Zwei Komponenten im .NET-Framework: – DataProvider: bietet Zugriff auf Datenquellen, Persistenzmechanismen (Kap. 1.4) – DataSet: bietet Zugriff auf Daten, Datenmanipulation (Kap 1.5) .NET Framework Data Provider Connection DataAdapter Transaktion Command SelectCommand InsertCommand Parameters DataSet DataTableCollection DataTable DataRowCollection DataColumnCollection UpdateCommand ConstraintCollection DataProvider DeleteCommand DataRelationCollection XML Database Wichtige Klassen in der Komponente .NET Framework DataProvider: • Connection – Verbindung zur Datenquelle • Command – SQL-Anweisung, auch parametrisiert DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET • DataReader – Cursor auf Ergebnismenge (READ_ONLY, FORWARD_ONLY) • DataAdapter – Verbindet Datenquelle mit DataSet (siehe Kap 1.5) Microsoft stellt 4 DataProvider bereit: 1. MS SQL Server – System.Data.SqlClient 2. OLE DB – System.Data.OleDB 3. ODBC – System.Data.OBDC WS 06/07 Seite 16 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift 4. Oracle – SystemData.OracleClient Unterschiede in der Architketur ADO.NET – JDBC Programmieren mit ADO.NET DataProvider 1 IDbConnection con = new S q l C o n n e c t i o n ( ) ; // einen hiervon IDbConnection con = new OdbcConnection ( ) ; // auswaehlen , j e nach Datenbank ! 3 5 IDbCommand cmd = con . CreateCommand ( ) ; cmd . Commant Text = " s e l e c t ∗ . . . " ; IDataReader dr = cmd . ExecuteReader ( ) ; Fragwürdige Programmiertechnik, da DB-Zuordnung fest im Code verankert ist und evtl. zum Ändern viele Aufrufe und includes angepasst werden müssen. Seit ADO.NET 2.0: ProviderFactory 2 DbProviderFactory f a c t = D B P r o v i d e r F a c t o r i e s . GetFactory ( " s q l s e r v e r " ) ; //Zuordnung in Config−F i l e ( machine . c o n f i g ) moeglich 4 IDbConnection con = f a c t . GetConnection ( ) ; 1.5 Speicherresidente Datenbankstrukturen mit ADO.NET (Folie: Aufbau einer DataSet) 1. DataSet speicherresidente Datenbank (In-Memory Database): enthält Tabellen (= Objekte der Klasse DataTable) • DataTable hat TableName, Coulumns (mit CoulmnName, DataType,...), Rows (mit Items pro Column) • DataRelations hat DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET parentCol = Tabelle + Spalte von Parent, ChildCol = Tabelle + Spalte von Child • Ferner Constraints: UniqueConstraint, ForeingnKeyConstraint • Speziell DataView: Sicht auf DataTable; zum Sortieren, Filtern o.ä. -> Anbindung an GUI 2. Anbindung an die Datenbank verantwortlich ist der DataAdapter, hat Properties WS 06/07 Seite 17 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift • SelectCommand z. B.: "select author, title from Books" • InsertCommand z. B.: "insert into Books(author, title) values (?,?)" • UpdateCommand z. B.: "update Books set author=?, title=? where author=? and title=?" • DeleteCommand z. B.: "delete from Books where author=? and title=?" Methode Fill des DataAdapter erzeugt DataTable in einem DataSet entsprechend SelectCommand. Klasse CommandBuilder erzeugt InsertCommand DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET WS 06/07 Seite 18 19 azamon Books isbn author 3-145. Moore .. .. . . ORM Entsprechung OO-Domänenmodell (speziell) Releationales Modell Datagrid Methode SetDataBinding als Objektstruktur (generisch) b2: b1:Buch isbn="3-145" author="Moore" da.Update() Books isbn author 3-145. Moore .. .. . . Books isbn author 3-145. Moore .. .. . . da.Fill() RAM, DataSet enth. DataTable azamon ADO.NET GUI ISBN Autor * 3-145. Moore GUI präsentiert Tabellen und FremdschlüsselPrimärschlüsselbeziehung DataViewManager DataGrid look and feel DataGridTableStyle DataGrid feuert Event RowChanging Rami Swailem FH Gießen-Friedberg DB2 Mitschrift 1.6 Objekt-Relationales Mapping am Beispiel Hibernate Thema: Konzeptbuch Rel. Modell – OO Sprachen Leitidee: Gegeben „normale“ Objekte z. B. Buch b = new Buch("3-145..."), Persistenzmechanismus für Objekte, möglichst „nicht-invasiv“ Technik: OR Mapping z. B. Java Data Objects, Hibernate Beispiel 1.2 Buchverwender (Klassen-deutsch, Tabellen-englisch) Auftrag * 0..1 AuftragsNr Datum Kunde KundenNr Name setKunde() addAPos() 0..1 * APos Anzahl setBuch() DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET WS 06/07 * 0..1 Buch ISBN Titel Autor Seite 20 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift 1 // Auftragsbearbeitung 3 5 7 9 Session s e s s i o n = getSessionFactory () . openSession () ; T r a n s a c t i o n tx = s e s s i o n . b e g i n T r a n s a c t i o n ( ) ; A u f t r a g a = new A u f t r a g ( ) ; a . setAuftragsNr (112) ; Date today = new Date ( ) ; a . setDatum ( today ) ; 11 s e s s i o n . save ( a ) ; // s o l l p e r s i s t e n z s e i n 13 15 17 19 21 APos ap1 = new APos ( ) ; ap1 . setBuch ( " 3 − 1 4 5 . . . " ) ; ap1 . s e t A n z a h l ( 1 ) ; APos ap2 = new APos ( ) ; ap2 . setBuch ( " 0 − 1 2 0 . . . " ) ; ap2 . s e t A n z a h l ( 1 ) ; 23 Kunde k = new Kunde ( ) ; 25 27 k . KundenNr ( 1 4 5 6 8 ) ; k . setName ( " S c h n e i d e r " ) ; 31 a . setKunde ( k ) ; a . addAPos ( ap1 ) ; a . addAPos ( a2 ) ; 33 tx . commit ( ) ; 35 session . close () ; 29 Folge: 1 3 5 DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET 7 i n s e r t into Customers ( c i d , cname ) values ( 1 4 5 6 8 , " S c h n e i d e r " ) i n s e r t into Order ( ordernum , c i d , or d e r _d at e ) values ( 1 1 2 , 1 4 5 6 8 , " 2006−11−14 " ) i n s e r t into OrderItems ( ordernum , i s b i n , qty ) values ( 1 1 2 , " 3 − 1 4 5 . . . " , 1 ) i n s e r t into OrderItems ( ordernum , i s b n , qty ) values ( 1 1 2 , " 0 − 1 2 0 . . . " , 1 ) Hibernate erzeugt diese SQL-Anweisungen! wie kann das gehen? 1. Entwickler der Klassen muss ein Paar Konventionen einhalten • Konstruktor ohne Parameter WS 06/07 Seite 21 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift • Setter- unf Getter- Methoden • Assoziationen zwischen Klassen müssen durch Interface deklariert sein. . z. B.: ..private set APos = new HashSet() set ∼ = CollectionInterface, Hashset ∼ = Collection Impl. 2. Zuordnung der Klassen zu den Datenbank-Tabellen wird deklariert in XML-Dateien mit Endung .hbm.xml z. B.: books.hbm.xml 2 4 6 <h i b e r n a t e −mapping> < c l a s s name = " Buch " t a b l e = " Books "> <i d name = " ISBN " column = " ISBN " \> <p r o p e r t y name = " a u t o r " column = " a u t h o r " /> <p r o p e r t y name = " t i t e l " column = " t i t l e " /> <\ c l a s s> <\ h i b e r n a t e −mapping> 3. Infrastruktur von Hibernate Die wichtigsten Klassen: SessionFactory– sorgt für Zugang zur Datenbank, konfiguriert in hibernate.cfg.xml 1 3 5 7 9 11 13 15 DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET 17 <?xml version= ’ 1 . 0 ’ e n c o d i n g= ’ u t f −8 ’ ?> < !DOCTYPE h i b e r n a t e −c o n f i g u r a t i o n PUBLIC " −// H i b e r n a t e / H i b e r n a t e C o n f i g u r a t i o n DTD//EN" " h t t p : // h i b e r n a t e . s o u r c e f o r g e . n e t / h i b e r n a t e −c o n f i g u r a t i o n − 2 . 0 . dtd "> <h i b e r n a t e −c o n f i g u r a t i o n> <s e s s i o n −f a c t o r y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . d r i v e r _ c l a s s ">sun . j d b c . odbc . JdbcOdbcDriver </ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . u r l ">j d b c : o d b c : a z a m o n</ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . username ">d i s</ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . password ">∗∗∗∗∗∗∗</ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . c o n n e c t i o n . p o o l _ s i z e ">10</ p r o p e r t y> <p r o p e r t y name=" show_sql ">t r u e</ p r o p e r t y> <p r o p e r t y name=" d i a l e c t ">n e t . s f . h i b e r n a t e . d i a l e c t . MySQLDialect</ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . d i a l e c t ">n e t . s f . h i b e r n a t e . d i a l e c t .M$ SQLDialect</ p r o p e r t y> <p r o p e r t y name=" h i b e r n a t e . hbm2ddl . auto ">update</ p r o p e r t y> < !−− Mapping f i l e s −−> <mapping r e s o u r c e=" books . hbm . xml " /> </ s e s s i o n −f a c t o r y> </ h i b e r n a t e −c o n f i g u r a t i o n> Session ∼ = Connection Transaction ∼ = Transaktion Query ∼ = eine MAschine für SQL ähnliche Abfragen mit Objekten WS 06/07 Seite 22 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift 2 Transaktionen und Nebenläufigkeitskontrolle 2.1 Eigenschaften und Verwendung von Transaktionen 2.2 Serialisierbarkeit und Nebenläufigkeitskontrolle 2.3 Isolationslevel in SQL-Datenbanksystemen 2.4 Strategien der Nebenläufigkeitskontrolle 3 Verteilte Datenbanken 3.1 Architektur verteilter Datenbanken 3.2 Datenspeicherung in verteilten Datenbanken 3.3 Verteilte Anfragen 3.4 Änderung verteilter Daten und Replikation 3.5 Verteilte Transaktionen 4 Datenbanksicherheit und Autorisierung x DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET WS 06/07 Seite 23 Rami Swailem FH Gießen-Friedberg DB2 Mitschrift 4.1 Autorisierung und Zugriffskontrolle 4.2 Techniken zum Recovery 5 Datenanalyse zur Entscheidungsfindung 5.1 Data-Warehouses 5.2 Data-Mining 6 Neue Datenbanktechnologien 6.1 XML und Datenbanken 6.2 Temporale Datenbanken 6.3 Geografische Datenbanken 6.4 Logik-basierte Datenbanken DB2_Mitschrift.tex,v,1.1,November 4, 2006 at 11:37:11 CET WS 06/07 Seite 24