Java File Persistence I
Um Daten in Enterprise Systemen persistent zu machen gibt es mehrere Ansätze. Bei dauerlaufenden, missionskritischen Systemen muss man darauf achten, dass die Daten zuverlässig gespeichert und wiedergelesen werden. Herausforderungen sind hier:
- konsistente Daten, auch nach einem Programmabsturz oder Stromausfall
- Online Datensicherung
- Eventuell eingebaute Replikation
- Wiederanlauf
- Transaktionen mit weiteren Systemen
Wenn also der Einsatz von Files unbedingt notwendig ist, so muss man sich zuerst mal ansehen, welche Probleme mit Files im Allgemeinen, und bei bestimmten Betriebsystemen insbesondere auftauchen:
Im Betrieb:
" oder ".bla" weniger, an, als UUIDs an. Zur Vermeidung von zuvielen Einträgen in Verzeichnissen kann man ein "Hashing" vornehmen. D.h. man legt Unterverzeichnise an. Bei UUIDS bietet sich an nicht die ersten Stellen der UUID zu nehmen weil diese zum einen weniger oft wechseln, und zum anderen dann das typische NTFS Präfix Problem auftaucht. Im 2. Teil findet sich ein Verfahren zum grupieren von UUID Dateinamen. Dateinamen und Pfade sollte man dann auch nicht allzusehr aufblähen, das erlaubt einigen Dateisystemen deutliche Optimierungen.
Fazit
Meiner Erfahrung nach sind Datei basierende Verfahren deswegen sehr beliebt, weil sie auf den Fall hin optimiert sind, dass keine Probeme auftauchen. Dies ist in vielen Situationen natürlich eine gültige Annahme, bei Missionskritischen Anwendungen aber im Allgemeinen nicht akzeptabel.
Der Aufwand ein System mit Dateipersistenz crashfest und betriebssicher zu machen ist enorm. Dabei werden sehr hohe Anforderungen an das Betriebsystem gestellt. Von daher sollten verantwortungsvolle Entwickler immer auch Alternativen wie DB Systeme in Betracht ziehen.
Allerdings sollte man nicht vergessen: File Storage ist einfach zu benutzen, das ist auch ein Pro Argument, da unnötige Komplexität den Betrieb ebenfalls behindert. Wer kennt nicht das Probem von properitären Datenbanken die so inkonsitent geworden sind, dass nichts mehr zu retten ist (man denke nur an Outook PST Files). Dieses Problem haben Filesysteme wesentlich weniger. Die Datenbanken die eingesetzt werden müssen also einen vergleichbaren Reifegrad haben. (Das erklärt übrigens auch meine starke Skepsis gegenüber Java/Embedded Datenbanken im OO und XML Umfeld).
Gerade Organiationsprogrammierer, die Unterhnehmensspezifische Anwendungen erstellen sollten deswegen um die Verwendung von einfachen Framework oder Containern bemüht sein, die einem die Arbeit abnehmen. (Aber vorsicht, so mancher Container verwendet eine sub-optimale File Implementierung, man stelle sich nur einen JMS Provider auf dieser Basis vor).
Im 2. Teil geht es ans eingemachte, Java Codeschnippsel für den Coder.
- Online Backup mittels "Open File" Software zwar mögich, sicher dann aber keinen garantiert transaktionalen Stand
- Große Anzahl von Dateien überfordern Filesysteme
- Fragmentierung
- Partielle Files
- Datenblöcke gemischt aus alten und neuen Daten
- File-Ende aufgefüllt mit 0-bytes
- Keine Atomare Transaktion um File abzuschliessen und Anwendung zu benachrichtigen
Datei abc.xml im Verzeichnis /bla konnte nicht gelesen werden.DB Systeme verwenden in Trailern immer eine change number die auch im Header zu finden ist. Der Grund hierfür liegt darin, dass in DBs Blöcke überschrieben werden. Wenn Sie dies nicht tun, wie ich empfohlen habe ist das kein Problem. Wenn Sie sich aber vom überschreiben nicht abhalten lassen wollen, so genügt ein XML Ende Tag nicht mehr der Anforderung, es könnte ja noch aus der letzten Datengeneration stammen. Um Online Datensicherungen etwas einfacher zu machen hat es sich bewährt, neben der oben beschriebenen Methode des File-Renames auch noch sich an den Grundsatz zu halten, dass Dateien nicht verändert werden dürfen. D.h. jeder Dateiname sollte für einen bestimmten Inhalt stehen und nicht wieder verwendet werden. Die alleinige Existenz/nichtexistenz ist hier also das Konsistenzmerkmal. Hier bieten sich z.B. UUIDs als Dateinamen an. Der Fragmentierung von Dateisystemen kann man nicht ganz entgehen, einige Tricks sind aber möglich:
Dieses Konsitenzproblem führt zu einem Abbruch der Verarbeitung der
Transation abc, aufgrund der XML-Parser Fehlermeldung: xxx"
- Die Anwendung sollte die Möglichkeit haben Logfiles in getrennten Filesystemen zu speichern
- Möglicht Zeitnahe eine Datei füllen
- Die Maximalgröße von Dateien, insbesondere Logfiles auf z.b. 100MB begrenzen
Trackbacks
IT Blog on : Fragmentierung
Windows User kennen die vielen Beschwörungsformeln die es so gibt, um ein Windows Laufwerk benutzbar zu halten. Tatsächlich sind Filesystemfragmentierung neben dem Vermüllen der Registry ein großes Problem bei der Performance von Desktop Systemen.
Auf
IT Blog on : Java File Persistence II
Wie schon im ersten Teil beschrieben, muss man trotz der Platform Unabhängikeit von Java etwas über die Zielsysteme wissen, um grobe Fehler zu vermeiden:
/** save data as UTF-8 string to file. */
saveFile(String data, File file) throws IOException {
Comments
Display comments as Linear | Threaded