Die Prävalenz ist eine einfache Technik, um einem speicherinternen Objektmodell ACID-Eigenschaften bereitzustellen, die auf binärer Serialisierung und Write-Ahead-Protokollierung basieren. Es funktioniert so:
- Beginnen Sie mit einem Schnappschuss. Serialisieren Sie das Objektmodell und schreiben Sie es in eine Datei.
- Erstellen Sie eine Journaldatei. Serialisieren Sie für jeden Aufruf des Objektmodells den Aufruf und seine Argumente.
- Wenn das Journal zu groß wird, werden Sie heruntergefahren oder es ist auf andere Weise praktisch. Führen Sie einen Prüfpunkt durch: Schreiben Sie einen neuen Schnappschuss und schneiden Sie das Journal ab.
- Laden Sie den letzten Schnappschuss und führen Sie alle im Journal aufgezeichneten Anrufe erneut aus, um ein Rollback oder eine Wiederherstellung nach einem Absturz oder einem Stromschlag durchzuführen.
Die Vorsichtsmaßnahmen, die erforderlich sind, damit dies funktioniert, sind:
- Lassen Sie veränderbare Objektreferenzen nicht entkommen oder in die Prävalenzschicht eintreten. Sie benötigen eine Art Proxy- oder OID-Schema, als würden Sie RPC ausführen. (Dies ist ein so häufiger Fehler für Neulinge, dass er als " Taufproblem " bezeichnet wird.)
- Die gesamte Logik, die von einem Anruf aus erreichbar ist, muss vollständig deterministisch sein und darf keine geschäftslogikbedeutenden E / A- oder Betriebssystemaufrufe ausführen. Das Schreiben in ein Diagnoseprotokoll ist wahrscheinlich in Ordnung, das Abrufen der Systemzeit oder das Starten eines asynchronen Delegaten im Allgemeinen jedoch nicht. Auf diese Weise wird das Journal identisch wiedergegeben, auch wenn es auf einem anderen Computer oder zu einem anderen Zeitpunkt wiederhergestellt wurde. (Der meiste Prävalenzcode bietet einen alternativen Zeitaufruf, um den Transaktionszeitstempel abzurufen.)
- Die Parallelität von Autoren führt zu Mehrdeutigkeiten bei der Interpretation von Journalen, daher ist dies verboten.
Ist es weil ...
- Leute entwickelten einen schlechten Geschmack für sie, nachdem sie versucht hatten, einen für ein Projekt zu verwenden, das nicht gut dafür geeignet war * ?
- Klaus Wuestefelds strenge Befürwortung hat die Leute abgeschaltet ?
- Leute, die das imperative Programmiermodell mögen , mögen es nicht , E / A von der Berechnung zu trennen , sondern die Berechnung lieber mit E / A und Threading-Aufrufen zu verschachteln?
- Prävalenzschichten sind konzeptionell so einfach und so eng an die Merkmale des Frameworks gebunden, in dem sie sich befinden, dass sie normalerweise für das Projekt maßgeschneidert werden, was sie zu fremd / nicht standardisiert / riskant macht.
- Es ist einfach zu schwer, klar zu halten, was Sie tun müssen, um es nicht zu tun.
- Die Köpfe von Neulingen scheinen nur zu explodieren, wenn sie mit etwas konfrontiert werden, das nicht die gleiche Art von zweistufiger datenbankgesteuerter App ist, die sie in der Schule geschrieben haben? ;)
* Der gesamte Datensatz passt in den Arbeitsspeicher , Sie benötigen keine Writer-Parallelität und Sie müssen keine Ad-hoc-Abfragen, Berichte oder Exporte in ein Data Warehouse durchführen. Mit Entschuldigungen an SQLite ist die Verbreitung eine Verbesserung der Sicherungsdateien und kein Ersatz für Oracle.
object-oriented
Jeffrey Hantin
quelle
quelle
Antworten:
Ich denke, einige der Probleme sind, dass sie einen SEHR spezifischen Anwendungsfall haben (Ihr nicht geeigneter Grund). Ich habe Systeme gebaut und daran gearbeitet, die diesen Ansatz verwenden, und wenn Sie ein Problem haben, das tatsächlich dieses Problem ist, kann es eine wunderbare Lösung sein.
Ein weiterer Teil ist, dass es sehr nach einigen der schmerzhafteren Teile des benutzerdefinierten Datenspeichers aussieht, die Sie vor mehr als 10 Jahren gefunden haben, und einige der gleichen Fallstricke aufweist (denken Sie beispielsweise an Batch-Batch-Aktualisierungen), die Ihre Probleme mit sich bringen "zu benutzerdefiniert" Punkt, macht es aber auch schwierig, Teile von der Stange zu finden, die höflich damit arbeiten.
Der letzte Teil ist, dass es in vielen Fällen verdammt schwierig sein kann, sie abzufragen, und die Leute im Allgemeinen sind es ziemlich gewohnt, ihre Antworten jetzt zu bekommen.
quelle
Ich denke, Sie müssen zuerst zeigen, dass so viele Entwickler sie absolut hassen. Ich glaube nicht, dass das der Fall ist. Bedenken Sie, dass Fowler vor einiger Zeit hier eine Art Muster dafür formalisiert hat .
quelle
Die Antwort auf die Frage ist, dass die Theorie zwar einfach ist, die Praxis jedoch nicht.
Das Testen eines solchen Setups erfordert Dutzende von Testfällen, das Hinzufügen eines Mehrfachprozesses oder von Multithread-Code. Dies führt zu Hunderten von möglichen Bedingungen, die getestet werden müssen, sowohl für die Persistenz als auch für die Wiederherstellung.
Jeder Transaktionsmonitor wie CICS, Tuxedo, Weblogic, Websphere, JBOSS oder .NET bietet all diese Funktionen auf saubere und getestete Weise. Und jede Datenbank bietet "genug" Transaktions- / Persistenz für die meisten Anwendungen.
Meistens wurde dieses Rad vor langer Zeit erfunden und perfektioniert.
quelle
Die Voraussetzungen klingen beim Codieren etwas lästig, insbesondere bei den meisten Systemen, die keine ACID-Konformität benötigen, wenn sie im Speicher ausgeführt werden. Overhead klingt auch ein bisschen böse - dort gibt es eine Menge Zustandsverfolgung.
quelle