Post on 11-Oct-2020
transcript
8. Persistenz
Software Engineering
Gliederung Vorlesung
� Einführung� V-Modell XT� Analyse und Anforderungsmanagement� Benutzungsoberflächen� Architektur� Entwurf� Entwurfsmuster� Persistenz� Implementierung� Konfigurationsmanagement� Testen� Abnahme, Einführung, Wartung und Pflege
Allweyer: Software Engineering
Allweyer: Software Engineering
Datenhaltung
� Objektorientierte Datenbank● Direkte Abbildung auf die Datenbank möglich
● Zu speichernde Objekte müssen als persistent gekennzeichnet werden, ggf. sind Typkonvertierungen erforderlich
● Für Objektverwaltung sind ggf. spezielle Klassen des ODBMS zu verwenden
� „Flache“ Dateien● Objektstrukturen sind zu sequenzialisieren
− Z. B. Satzweises Abspeichern in der Datei, zusätzlich Aufbau eines Index zum schnellen Auffinden des jeweiligen Datensatzes
− Beim Speichern eines Objektes sind jeweils Operationen erforderlich, die die entsprechenden Einträge in die Datei sowie in den Index vornehmen
� Relationale Datenbank− Siehe folgende Folien
Allweyer: Software Engineering
Schnittstellen zu relationalen Datenbank-Systemen
� Proprietäre Schnittstellen einzelner Hersteller
� Embedded SQL: Erweiterung von Programmiersprachen, um direkt aus der Anwendung über SQL-Befehle auf die Datenbank zuzugreifen
� ODBC (Open Database Connectivity)● Standardisierte Schnittstelle zum Zugriff auf relationale DB-Systeme
● Es existieren ODBC-Treiber für die meisten heute verfügbaren RDBMS
� JDBC (Java Database Connectivity)● Speziell für Java entwickelt
● Objektorientiert
● Datenbank-übergreifend
Allweyer: Software Engineering
Relationale Datenbanken
� Object-Relational Mismatch: Semantic Gap
Allweyer: Software Engineering
Anfrage an das relationale Datenmodell
� Anfrage: Gib alle Bücher die vom Autor XY beim Verlag Z erschienen sind
● Datenzugriff:
− Im Prinzip müssen alle Tabellen "ge-joint" werden. Es wird zuerst eine große Tabelle gebaut, auf der dann projiziert wird.
� SQL-AnweisungSELECT b.Titel
FROM Buch b, BuchAutoren ba, Autor a, Verlag v
WHERE a.nachname = "XY"
AND v.name = "Z"
AND v.id = b.verlagId
AND b.id = ab.buchId
AND ab.autorId = a.id
Allweyer: Software Engineering
Datenstruktur im objektorientierten Modell
� Daten entsprechen einem Graphen (Objekt-Graph)
Allweyer: Software Engineering
Anfrage an objektorientiertes Modell
� Anfrage: Gib alle Bücher die vom Autor XY beim Verlag Z erschienen sind● Eine Collection (Collection aller Autoren) durchsuchen und dann navigieren. Es müssen nur
noch die Objekte (Bücher) traversiert werden, die auch zum Autor gehören.
Allweyer: Software Engineering
Integrationsprobleme
� Object-Relational Mismatch● Gewährleisten der Objektidentität (OID)
● Abbildung von Objekten
● Abbildung von Vererbungshierachien
● Realisierung von Polymorphismus
● Abbildung von Assoziationen, Aggregationen und Kompositionen − (Nur 1:n Beziehungen direkt darstellbar)
Allweyer: Software Engineering
Realisierung von Polymorphismus
� Bereitstellung von Meta-Information
� Mechanismus für late binding● Festlegung der Wertebereiche von verschiedenen Suchstrategien. Z.B.:
Suche nur über Blattklassen (Angestellter oder Kunde) oder über die komplette Hierarchie (alle Personen).
Allweyer: Software Engineering
Abbildung von Beziehungen
� Abbildung von Assoziationen, Aggregationen und Kompositionen
● Kompositionsobjekt (z.B. Inner Class) wird rekursiv aufgelöst.
● Assoziation und Aggregation werden über Fremdschlüssel abgebildet.
● Aggregation: Cascade-Delete und Pre-Fetch berücksichtigen (Integritäts-und Performanceaspekte).
Allweyer: Software Engineering
Integration relationaler Datenbanken
� Dereferenzierung von Beziehungen (Navigation)
� Verwendung von Proxys oder Lazy Instanciation
Einfacher Ansatz für Persistenz
� Enge Kopplung!
� Hohe Abhängigkeit zwischen fachlicher Komponente und Datenhaltung!
� Änderungen sind schwierig
Allweyer: Software Engineering
Quelle: Starke, Effektive Software Architekturen.3. Aufl., Hanser 2008
Einfache Persistenzschicht mit Datenklassen
� Einfacher Ansatz� Entwickler müssen sich aber immer noch selbst um Details der
Speicherung kümmern� Hohe Abhängigkeit zwischen Klassenstrukturen und
Tabellenstrukturen� Vernetzte Klassenstrukturen aufwändig zu speichern
Allweyer: Software Engineering
Quelle: Starke, Effektive Software Architekturen.3. Aufl., Hanser 2008
Allweyer: Software Engineering
Anforderungen an die Persistenzschicht
� Kapselung der Speicherungsaspekte● Fachliche Klassen brauchen nur save(), read(), u.ä.
� Support verschiedener Speicherungsmechanismen● Verschiedene Datenbanken, Dateien, …● Verschiedene DB-Hersteller und SQL-Dialekte
� Unterstützung von Vererbungshierarchien� Unterstützung von Transaktionen� Unterstützung von Lazy Instantiation� Bearbeitung mehrerer Objekte auf einmal� Automatische Erzeugung eindeutiger Object Identifier (OID)� Toleranz gegenüber Änderungen der DB
● Performance Tuning-Maßnahmen sollten keine Auswirkung auf die Anwendung haben
Nach: Starke, Effektive Software Architekturen.3. Aufl., Hanser 2008
Komponenten von Persistenzschichten
Allweyer: Software Engineering
Quelle: Starke, Effektive Software Architekturen.3. Aufl., Hanser 2008
Data Access Object (DAO) Muster
Allweyer: Software Engineering
Quelle: Starke, Effektive Software Architekturen.3. Aufl., Hanser 2008
Ablauf bei der Nutzung des DAO-Musters
Allweyer: Software Engineering
Quelle: Starke, Effektive Software Architekturen.3. Aufl., Hanser 2008
Allweyer: Software Engineering
Einfache Persistenzschicht
1. Abbildung auf Tabellen
2. Database Broker-Muster
3. Materialisierung von Objekten
4. Optimierung der Materialisierung mittels Cache
5. Virtual Proxy Muster
6. Materialisierung von Objektstrukturen
7. Transaktionen
Quelle: Balzert, H.: Lehrbuch der Objektmodellierung
Allweyer: Software Engineering
1. Abbildung auf Tabellen
� Einfache Klasse wird auf eine Tabelle abgebildet, wobei die Objekt-ID (OID) hinzugefügt wird
� Klassenattribute werden in einer eigenen Tabelle gespeichert
� 1:*-Assoziationen: Eintrag der entsprechenden OIDs als Fremdschlüssel in die Tabelle am „many“-Ende der Assoziation
� *:*-Assoziationen: Nutzung einer eigenen Tabelle
� Vererbung – mehrere Möglichkeiten● Eine Tabelle für alle Objekte der gesamten Vererbungsstruktur
● Eigene Tabelle für jede konkrete Klasse
● Eigene Tabelle für jede Klasse
Allweyer: Software Engineering
2. Database Broker-Muster
� Nutzung einer Klasse „Broker“● Zerlegen der Objekte in Datensätze (De-Materialisierung)
● Wiedergewinnen der Datensätze (Materialisierung)
● Cache-Verwaltung
� Jede persistente Klasse kann einen eigenen Broker haben
Allweyer: Software Engineering
3. Materialisierung von Objekten
� Nutzung des Schablonenmethoden-Musters zum Aufbau eines Persistence-Frameworks
● Siehe folgende Folie
� Dies ist ein Beispiel für ein typisches Framework● Abstrakte Oberklassen verwenden Schablonen-Methoden
● Die Software-Entwickler fügen Unterklassen hinzu
● In den Unterklassen werden elementare Operationen definiert, um die geerbten Schablonenmethoden zu vervollständigen
Allweyer: Software Engineering
Materialisierung von Objekten
objectWith(anOID) : ObjectinCache(anOID) : ObjectmaterializeWith(anOID) : Object
Broker
currentRecordAsObject() : ObjectmaterializeWith(anOID) : ObjectselectFirst(query) : Object
RelationalBroker
currentRecordAsObject() : Artikel
ArtikelBroker
OID()nummer()bezeichnung()preis()
Artikel
field(fieldName) : Object
RDBRecord
1 1
Operation zum Aufbaueines Objekts: Prüft, obbereits im Cache undgibt ggf. das Objekt zurück. Wenn nicht: Auf-ruf materializeWith()
Operation zum Zusam-mensetzen eines Objekts.Hierbei Aufruf voncurrentRecordAsObject
currentRecord
Artikel a = new Artikela.Nummer(currentRecord.field(„Nummer“)...return a
Allweyer: Software Engineering
4. Optimierung d. Materialisierung mittels Cache
� Materialisierung von Objekten ist relativ aufwändig
� Zur Verbesserung der Performance werden materialisierte Objekte in einem Cache-Speicher gehalten
� Falls jede Anwendungsklasse einen eigenen Broker besitzt, gibt es auch für jede Klasse einen eigenen Cache
� Es kann bis zu 6 Caches pro Broker geben, wobei die Caches dann jeweils einen Transaktionszustand realisieren (s.u.)
objectWith(anOID) : ObjectinCache(anOID) : ObjectmaterializeWith(anOID) : Object
Brokeradd(OID, Object)find(OID) : ObjectisEmpty() : boolean
ObjectCache
1 6
Allweyer: Software Engineering
5. Virtual Proxy-Muster
� U. U. kann es sinnvoll sein, ein Objekt erst dann zu materialisieren, wenn es benötigt wird
� Einsatz des Proxy-Musters● Proxy-Objekt kennt nur die OID und die Signaturen des eigentlichen
Objekts
● Wird eine Botschaft, an das Proxy-Objekt gesandt, stößt dieses die Materialisierung des Objektes an und leitet die Botschaft an dieses weiter
Allweyer: Software Engineering
6. Materialisierung von Objekt-Strukturen
� Es sollen nicht nur einzelne Objekte materialisiert werden, sondern gesamte Strukturen (z. B. ein Lieferant mit allen Artikeln, die er liefert)
� Wird die Gesamtstruktur materialisiert, so ist dies sehr aufwändig
� Lösung:● Materialisierung on-demand
● Erst wenn zu dem assoziierten Objekt eine Botschaft geschickt wird, wird dieses durch sein Proxy materialisiert
Allweyer: Software Engineering
7. Transaktionen
Beispiel: Java Persistence API (JPA)
� Spezifikation für die Persistierung von Java-Objekten in relationale Datenbanken
� Ursprünglich aus Java EE (EJB), es handelt sich aber um eine leichtgewichtige Lösung, auch für Java SE-Anwendungen
� Verschiedene Implementierungen (JPA-Provider)● z. B. Hibernate, EclipseLink, TopLink
� Objekt-relationales Mapping von POJOs (Plain Old Java Objects) mittels Meta-Daten
● als Annotations im Java Code, oder
● in separater XML-Datei
� Weitere Elemente● Abfragesprache
● Implementierungen ermöglichen zumeist auch die Erzeugung des DB-Schemas
Allweyer: Software Engineering
JPA: Entity-Klasse mit Annotation
Allweyer: Software Engineering
Quelle: Alexander Kunkel, http://www.kunkelgmbh.de/jpa/JPA%20mit%20Hibernate.pdf
JPA: Insert
Allweyer: Software Engineering
Quelle: Alexander Kunkel, http://www.kunkelgmbh.de/jpa/JPA%20mit%20Hibernate.pdf
JPA: Beziehungen
Allweyer: Software Engineering
Quelle: Alexander Kunkel, http://www.kunkelgmbh.de/jpa/JPA%20mit%20Hibernate.pdf