Datenbank und Informationssysteme von Rami Swailem pdfauthor

Werbung
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
Herunterladen