Persistenz
Aus ProgrammingWiki
Wissen | Können | Projekt |
---|---|---|
|
|
|
Beinahe jede größere Webapplikation muss zu irgendeinem Zeitpunkt Daten speichern oder auf gespeicherte Daten zugreifen. Serverseitig gibt es dazu zahlreiche Möglichkeiten. Im einfachsten Fall können durch Interaktion mit dem serverseitigen Dateisystem beliebige Dateien gepeichert und ausgelesen werden. PHP bietet dazu die Methoden fread und fwrite an, bei Node.js gibt es für diese Zwecke das Paket fs mit den Funktionen readFile und writeFile. Um auch komplexe Objekte in eine serialisierbare Struktur zu überführen, und damit speicherbar zu machen, bieten sich JSON und XML Konvertierungen an. In PHP müssen dazu entsprechende Erweiterungen installiert sein (z.B. SimpleXML), Node.js bietet, da Javascript-basierend, nativ die JSON Konvertierung an.
Zur Speicherung größerer Datenmengen sollten Datenbankmanagementsystem (DMBS) verwendet werden. Durch Indizierung und die Möglichkeit selektiver Abfragen, können hier trotz enormer gespeicherter Datenmengen angefragte Informationen in angemessener Zeit ermittelt werden. Als Beispiele wären hier MySQL, eXist-DB und MongoDB (Node.js mit MongoDB) zu nennen. Aber auch viele andere DBMS können über standardisierte Schnittstellen wie ODBC, JDBC oder ADO.NET angesprochen werden.
Die clientseitige Speicherung von Daten ist bei HTML5 durch den Browser beschränkt. Direkte Interaktionen mit dem lokalen Dateisystem sind nicht erlaubt. Hier stehen also nur die Möglichkeiten zur Verfügung die der jeweilige Browser bietet.
Cookies
Cookies sind die ursprünglich einzige Variante zur Speicherung von Daten am Client und werden demnach von allen Browsern unterstützt. Sie werden bei jedem HTTP Aufruf mitgesendet und stehen somit auch am Server zur Verfügung. Zu jeder Domain kann hier eine verhältnismäßig kurze Zeichenkette gespeichert werden. Sie besteht aus einer Reihe von Name-Wert-Paaren, wobei jedem Paar ein Verfallsdatum zugeordnet werden kann. Nach Erreichen dieses Zeitpunkts wird die Information vom Browser gelöscht. Name und Wert werden mit = einander zugewiesen und Paare werden mit ; voneinander abgetrennt. Javascript bietet mit document.cookie ein Objekt zum Zugriff auf die gespeicherten Informationen an.
|
WebStorage
Moderne Browser bieten mit WebStorage eine bessere Alternative zu den Cookies an. Auch hier werden Name-Wert-Paare gespeichert, jedoch werden diese ausschließlich vom Client verwaltet und können bedeutend mehr Raum einnehmen als Cookies. Javascript bietet mit sessionStorage und localStorage Objekte zur Interaktionen mit diesem Speicher an. Je nach dem ob Daten nur über die Laufzeit einer Session (solange der Tab geöffnet ist) oder auch darüber hinaus gespeichert werden sollen, wird das eine oder andere Objekt gewählt.
|
IndexedDB
Zur Speicherung größerer Datenmengen wird in modernen Browsern die IndexedDB-API angeboten. Wie auch bei WebStorage und Cookie ist der Speicher Domain-spezifisch und unterliegt der Same-Origin-Policy. Die mit indexedDB erzeugten Datenspeicher sind NoSQL-Datenbanken, sie haben also keine starre Tabellenstruktur sondern sind nur eine Ansammlung von beliebig strukturierten Datensätzen. Bezüglich Javascript kann so ein Datensatz als Objekt mit beliebigen Eigenschaften betrachtet werden. Um trotz dieser Unstrukturiertheit schnelle Datenbankoperationen zu ermöglichen, können Eigenschaften indiziert werden. In einem solchen Index, werden die Datensätze/Objekte nach Ihren Eigenschaftswerten gruppiert und sortiert um bei einer entsprechenden Anfrage nicht alle gespeicherten Elemente durchlaufen zu müssen.
Es gibt keine explizite Funktion zur Erzeugung einer IndexedDB. Stattdessen wird durch die Funktion open die Datenbank einer bestimmten Version angefordert. Dabei wird ein IDBRequest Objekt zurückgegeben, welches diese Anforderung kapselt. Das eigentliche Erzeugen oder Öffnen der Datenbank erfolgt asynchron. Es müssen also entsprechende Callback-Funktionen am IDBRequest definiert sein, die auf die eintretenden Zustände reagieren könen. Ist eine angeforderte Datenbank z.B. noch nicht vorhanden oder nicht in der angeforderten Version verfügbar wird das onupgradeneeded Event ausgelöst. Die Datenbank wird dabei automatisch zur Verfügung gestellt und es können hier mit createObjectStore neue Object-Stores (im weitesten Sinne die Tabellen der Datenbank) erzeugt oder vorhandene auf die neue Version angepasst werden. Die Bereitstellung des Datenbank-Objekts erfolgt beim Ereignis onsuccess.
Jedes in einer IndexedDB gespeicherte Objekt muss einen Schlüssel haben unter dem es abgelegt wird. Bei Erzeugung eines Object-Stores wird festgelegt, wie dieser Schlüssel bezogen wird. Es gibt hier die Möglichkeiten diesen Schlüssel aus einer Eigenschaft des zu speichernden Objekts zu entnehmen, ihn explizit bei der Speicherung anzugeben oder ihn automatisch generieren zu lassen. Zusätzlich können an jedem Object-Store Eigenschaften definiert werden, die dem Index hinzugefügt werden sollen, um selektive Zugriffe auf Basis dieser Eigenschaftswerte zu beschleunigen.
Jeglicher Zugriff auf die Inhalte einer IndexedDB erfolgt über Transaktionen, also eine Reihe von Datenbankinteraktionen die entweder alle oder im Fehlerfall gar nicht auf die Datenbank angewendet werden. Mit der Funktion transaction wird unter Angabe von Object-Store und Zugriffsberechtigung eine solche erzeugt. Von diesem IDBTransaction Objekt aus kann nun auf die Object-Stores zugegriffen und Inhalte erzeugt, bezogen, aktualisiert oder entfernt werden (CRUD).
Hinweis: Viele Browser können in einem privaten Modus gestartet werden. Nicht alle Browser unterstützen in diesem Modus IndexedDB.
|
Projekt und weitere Übungen
![]() | WE1-P10.zip (1.8 MB) |
- Besucherbegrüßung: Eine nette - wenn auch manchmal nervende - Spielerei mit Cookies ist das Merken des Besuchernamens sowie das anschließende Wiedererkennen des Besuchers und eine entsprechende Begrüßung. Alles was dazu benötigt wird ist der ausgefragte Name der gespeichert werden muss. Später wird er einfach wieder ausgelesen und in den Begrüßungstext eingebaut.
Entwerfen Sie eine kleine WebAnwendung.
Ebenso lässt sich auch ein Login merken, indem abgefragt wird, ob der User einen entsprechenden Cookie gespeichert hat. Ist das der Fall, kann das Passwort evtl. noch überprüft werden und der User wird dementsprechend entweder auf die Login-Seite oder auf den User-Bereich umgeleitet. Dies entspricht zwar nicht dem klassischen und sicherstem Verfahren - ist aber einfach und relativ unkompliziert zu realisieren. - Verwenden Sie die folgenden Javascript-Funktionen um Cookies komfortabel zu verwalten. Schreiben Sie eine kleine Webanwendung, die dies erledigt.
- Connection pooling ist ein Mechanismus zur Verwaltung eines Caches für mehrere parallele Verbindungen mit dem DBMS, z.B. MySQL. Verwenden Sie diese Anleitung zur Installation von MySQL connection pooling. Installieren Sie siege (unter Windows), um die Verbindung mehrerer Clienten in einer bestimmten Zeit zu simulieren und zu analysieren
- Entwickeln Sie eine kleine WebAnwendung, die einen Knopf zur Übertragung einer JSON-Datenbank vom Server in eine IndexedDB auf dem Client anbietet. Anschließend sollen im offine-Betrieb einige Datensätze aus der IndexedDB entnommen und dargestellt werden.
- Arbeiten Sie dieses Beispiel durch.
- Installieren Sie das Native XML-DBMS eXist. Machen Sie sich mit dem eXist-db REST API vertraut. Verwenden Sie das NODE.js-Client-Modul für eXist-db, um von NODE.js (unter Verwendung der REST API) auf eine eXist-DB zugreifen zu können.