Kapitel 6

Werbung
Kapitel 6
Dr. Brigitte Mathiak
Anbindung an Anwendungen
Lernziele

• Das grundsätzlichen Problem bei der Kopplung von
objektorientierten Programmiersprachen mit relationalen
Datenbanken kennenzulernen
• Konzepte zur Anbindung von Datenbanken an Applikationen
• Selbst einfache Datenbankanbindungen programmieren zu
können
• Die grundlegende Funktionsweise von Persistenz
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
2
Impedance Mismatch zwischen OO und RM
Ein Objekt wird definiert durch:
• Identität
• Zustand
• Verhalten
• Kapselung
Eine Relation enthält Aussagen mit dem Wahrheitswert TRUE.
Beispielsweise: Es gibt einen PROFESSOR namens Sokrates,
dieser hat den RANG C4 und arbeitet im RAUM 226.
Beides ist nicht trivial kompatibel. Warum?
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
3
Impedance Mismatch zwischen OO und RM (2)

Struktur:
• Dieses Problem haben wir bereits in Kapitel 3 kennengelernt,
um von UML ins Relationenmodell zu kommen
• RM hat keine Vererbung, kein Verhalten, keine 1-zu-n oder gar
n-zu-n Beziehungen
Identität:
• Tupel haben von sich aus keine eindeutige Identität.
Datenkapselung:
• Objekte können selbst bestimmen wie sie verändert werden
Arbeitsweise:
• Relationen arbeiten global transaktionsbasiert
• Objekte sind untereinander vernetzt
Ergebnismenge:
• SQL-Anfragen liefern (Multi-)Mengen, keine Objekte
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
4
Die gute Nachricht

Alle diese Probleme sind im Einzelfall lösbar.
Die schlechte Nachricht
Entweder man muss Einschränkungen bei den Objekten
hinnehmen, die persistent sein sollen, oder es wird sehr
kompliziert und/oder unperformant.
(Oder man nimmt eine nicht-relationale Datenbank.)
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
5
Struktur einer OCCI Anwendung
Quellcode
(benutzt OCCI API und
Klassen)
C++ Compiler
OCCI Header
occi.h
•occiCommon.h
•occiControl.h
•occiData.h
•occiObjects.h
Linker
OCCI API header
Von OTT generierte C++
Header
Von OTT generierte C++
Implementierungen
OCCI Bibliothek
(statisch .lib oder
dynamisch .dll)
OCCI Bibliothek
•libocci.so/libocci.a/oraocci9.dll
Anwendung
Oracle C++ Call Interface(OCCI)
6
OCCI – Klassenstruktur
Environment
Create
Create
Create
ConnectionPool
Get
Get
MetaData
Connection
Get
StatelessConnection
Pool
Create
Statement
Get
Execute
ResultSet
Oracle C++ Call Interface(OCCI)
7
Schritt 1 – Eine Verbindung aufbauen

#include "DatabaseConnection.h";
…
try {
Environment* env = Environment::createEnvironment();
Connection* con = env->createConnection(user, password,
connectionString);
cout << "Connection success!" << endl;;
}
catch(SQLException &e) {
cout << "Connection failed!" << endl;
cout << e.what();
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
8
Schritt 2 – Etwas ausführen

try {
Statement *stmt = con->createStatement("INSERT INTO
hören VALUES (:1, :2)");
stmt->setInt(1, 26120);
stmt->setInt(2, 5001);
stmt->executeUpdate();
con->terminateStatement(stmt);
}
catch(SQLException &e) {
cout << "Exception thrown for INSERT" << endl;
cout << e.what() << endl;
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
9
Schritt 3 – Etwas auslesen

Statement stmt =
con->createStatement("SELECT PersNr, Boss FROM
Assistenten");
stmt->executeQuery();
ResultSet rset = stmt->getResultSet();
while (rset->next()) {
cout << " PersNr: " << rset->getInt(1) << "
"
<< " Boss: " << rset->getInt(2) << endl;
count++;
}
stmt->closeResultSet(rset);
con->terminateStatement(stmt);
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
10
Schritt 4 – Verbindung kappen

env->terminateConnection(con);
Environment::terminateEnvironment(env);
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
11
Schritt 5 - Errorhandling

try {…}
catch(SQLException &e) {
int errno = oraex->getErrorCode();
// die ORA nummer, http://www.ora-error.com/
string errmsg = oraex->getMessage();
//Die Nachricht zum Fehler
cout << ex.what() << endl;
//
// echte Fehlerbehandlung nicht vergessen …
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
12
Nachteile von Treibern
• Kein Syntax-Check des SQL-Statements
• Es kann nicht über Statement-Grenzen hinweg optimiert
werden.
• Es werden keine Objekte abgespeichert, sondern nur
simple Types (kann mit OTT umgangen werden)
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
13
Spracheinbettung (z.B. SQLJ)
• Beispiel:





/*
EXEC SQL
DELETE FROM emp
WHERE CURRENT OF emp_cursor;
sqlstm.stmt = “DELETE FROM EMP WHERE ROWID=:b1”;
sqlstm.iters = (unsigned long)1;
sqlstm.offset = (unsigned short)193;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)0;
sqlcex(&sqlctx, &sqlstm, &sqlfpn);
*/
• Spracheinbettungen und 4GL-Sprachen bieten eine bessere Integration,
weil das SQL direkt im Quellcode steht
• Ein Präprozessor übersetzt die eingebettete Befehle und fängt damit auch
Syntax-Fehler ab
• Weiterer Vorteil: Variablen können besser eingesetzt werden
Hauptnachteil:
• Geringe Unterstützung von anderen Produkten, da Spracheinbettungen als
altmodisch gelten
• Die Sprache selbst wird verändert, dies kann
• zu Inkompatibilitäten mit anderen Präprozessoren führen
• Debugging deutlich schwieriger machen
Fazit: Nicht mehr state-of-the-art
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
14
Persistenzframeworks – Object Relational Mapper (ORM)
• Grundidee: Transparente Persistenz von Objekten durch
Mapping zwischen Objekten und Relationen
• Vorgehen: Der Zustand bestimmte Objekte wird vom
Framework in der Datenbank festgehalten
• Vorteil: Der Programmierer kann mit den Objekten normal
arbeiten
• Weiterer Vorteil: Das Mapping ist nicht mehr implizit in der
Geschäftslogik „versteckt“, sondern wird explizit angegeben
• Netter Nebeneffekt: Die Aufteilung in Domänenklassen, die
persistiert werden, und in andere Klassen entspricht dem MVCProgrammierparadigma
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
15
ORM (Beispiel Hibernate)

• Das Modell wird in Domänenklassen
festgehalten (EJBs)
• Der Zugriff auf die EJBs erfolgt von
Applikationsseite aus über DAOs
(Data Access Objects) zur Entkopplung
• Hibernate selbst greift auf die
Domänenklassen per Reflection zu
• Das Mapping zwischen Objekten und
Datenbank wird durch XML-Dateien
festgelegt (oder Annotations)
• Der Zugriff auf die Datenbank geschieht per JDBC
• Die Konfiguration sowohl des Datenbankzugriffs als auch des
Verhaltens von Hibernate wird zentral verwaltet
http://www.hibernate.org/hib_docs/v3/reference/en/html/architecture.html
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
16

ORM (Beispiel Hibernate; Domänenklasse)
Professoren
• Beispiel einer Domänenklasse:
PersNr
Name
Rang
Raum
2125
Sokrates
C4
226
2126
Russel
C4
232
// Markiert die Klasse als persistierbar
@Entity
// Der Default Tabellenname wäre PROFESSOR
@Table ( name = “Professoren“)
public class Professor {
@Id @GeneratedValue
Long PersNr; // Jede Klasse sollte eine ID haben
String Name;
String Rang;
Long Raum;
// leerer public Konstruktur ist notwendig für Entities
public Professoren(){};
/* getter und setter … */
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
17

ORM (Beispiel Hibernate; DAO)
Professoren
• Beispiel eines DAOs:
•
Hinweis:
getHibernateTemplate() kommt aus DAO
PersNr
Name
Rang
Raum
2125
Sokrates
C4
226
2126
Russel
C4
232
public class ProfessorDAOHibernate extends DAO
implements ProfessorDAO{
public void saveProfessor(Professor toSave){
getHibernateTemplate().saveOrUpdate(toSave);
}
public Professor getProfessorByPersNr(int PersNr){
return (Professor) getHibernateTemplate().
get(Professor.class, PersNr);
}
public void deleteProfessor(Professor toDelete){
getHibernateTemplate().delete(toDelete);
}
}
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
18
ORM (Beispiel Hibernate; weiterführend)

• Komplexe Anfragen können sowohl über die Hibernate eigene
Anfragesprache HQL als auch SQL gemacht werden
• Es werden mehrere Methoden angeboten 1-zu-n und n-zu-n
Beziehungen in der Datenbank darzustellen
• Sowohl andere Objekte als auch Collections werden als Attribute
akzeptiert
• Allerdings muss ein Mapping explizit angegeben werden
• Es gibt viele Tools, die den Einstieg in Hibernate erleichtern
und viele der benötigten Dateien automatisch generieren
• Domänenklassen können aus der Datenbank erzeugt werden
• Standard DAOs können generiert werden
• Das Datenbankschema kann aus den Domänenklassen generiert
werden
• Etc.
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
19
Nachteile ORM
• Relativ großer Overhead für kleine Projekte
• Alles muss in Objekten gespeichert werden
• Gerade am Anfang ist einem nicht ganz klar, was tatsächlich
passiert
• Benötigt Introspection, kann daher nicht für alte
Programmiersprachen, wie etwa C++ umgesetzt werden
Vorteile ORM
• Weniger Quellcode in der Persistenzschicht (-> weniger Fehler)
• Viele Konfigurationsoptionen um z.B. die Performanz zu
optimieren
• Hervorragende Umsetzung von loser Kopplung zwischen den
Komponenten Modell und Persistenz innerhalb eines
Programms
• Im Moment der State-of-the-Art daher stete Weiterentwicklung
und neue Features
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
20
Fazit
• Es gibt verschiedene Möglichkeiten Anwendungen an eine
relationale Datenbank anzubinden
• Das Hauptproblem ist dabei der Impedance Mismatch zwischen
objektorientierter und relationaler Welt
• Der einfachste Weg ist es direkt per Treiber mit der Datenbank
zu kommunizieren
• Eine etwas bessere Integration bieten Spracheinbettungen
• OR-Mapper erlauben es das Mapping zwischen den Objekten
und der Datenbank festzulegen. So kann der Programmierer
direkt mit den Objekten arbeiten.
Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen
21
Herunterladen