21
Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

Embed Size (px)

Citation preview

Page 1: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

Dr. Brigitte Mathiak

Kapitel 6

Anbindung an Anwendungen

Page 2: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen 2

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

Page 3: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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

Page 4: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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 BeziehungenIdentität:• Tupel haben von sich aus keine eindeutige Identität. Datenkapselung:• Objekte können selbst bestimmen wie sie verändert werdenArbeitsweise:• Relationen arbeiten global transaktionsbasiert • Objekte sind untereinander vernetztErgebnismenge:• SQL-Anfragen liefern (Multi-)Mengen, keine Objekte

Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen 4

Page 5: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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

Page 6: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

Oracle C++ Call Interface(OCCI) 6

Struktur einer OCCI Anwendung

Quellcode(benutzt OCCI API und

Klassen)

C++ Compiler

OCCI API header

Linker

Anwendung

OCCI Bibliothek(statisch .lib oder dynamisch .dll)

Von OTT generierte C++ Implementierungen

Von OTT generierte C++ Header

OCCI Header occi.h

•occiCommon.h•occiControl.h

•occiData.h•occiObjects.h

OCCI Bibliothek•libocci.so/libocci.a/oraocci9.dll

Page 7: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

Oracle C++ Call Interface(OCCI) 7

OCCI – Klassenstruktur

Create

StatelessConnectionStatelessConnectionPoolPool

ConnectionConnectionPool

Create Create

Environment

GetGet

Statement

Create

ResultSet

Execute

MetaData

Get

Get

Page 8: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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

Page 9: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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

Page 10: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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

Page 11: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

Schritt 4 – Verbindung kappen

env->terminateConnection(con);Environment::terminateEnvironment(env);

Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen 11

Page 12: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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 Fehlercout << ex.what() << endl;//

// echte Fehlerbehandlung nicht vergessen …

}

Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen 12

Page 13: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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

Page 14: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

Spracheinbettung (z.B. SQLJ)

• Beispiel: /* EXEC SQL DELETE FROM emp WHERE CURRENT OF emp_cursor; */

• 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 werdenHauptnachteil: • 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

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);

Page 15: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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 MVC- Programmierparadigma

Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen 15

Page 16: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

ORM (Beispiel Hibernate)

Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen 16

http://www.hibernate.org/hib_docs/v3/reference/en/html/architecture.html

• Das Modell wird in Domänenklassenfestgehalten (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-Dateienfestgelegt (oder Annotations)

• Der Zugriff auf die Datenbank geschieht per JDBC• Die Konfiguration sowohl des Datenbankzugriffs als auch des

Verhaltens von Hibernate wird zentral verwaltet

Page 17: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

ORM (Beispiel Hibernate; Domänenklasse)

• Beispiel einer Domänenklasse:

// 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 habenString Name;String Rang;Long Raum;

// leerer public Konstruktur ist notwendig für Entitiespublic Professoren(){};

/* getter und setter … */}Datenbanken für Mathematiker, WS 11/12 Kapitel 6: Anbindung an Anwendungen 17

Professoren

PersNr Name Rang Raum

2125 Sokrates C4 226

2126 Russel C4 232

Page 18: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

ORM (Beispiel Hibernate; DAO)

• Beispiel eines DAOs: • Hinweis:

getHibernateTemplate() kommt aus DAO

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

Professoren

PersNr Name Rang Raum

2125 Sokrates C4 226

2126 Russel C4 232

Page 19: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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

Page 20: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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

• 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

Vorteile ORM

Page 21: Dr. Brigitte Mathiak Kapitel 6 Anbindung an Anwendungen

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