Frage

Ich schreibe ein clojure Programm, das das STM verwendet. Im Moment bin ich bevölkern die STM (mit Lit.) beim Start aus einer Datenbank, und dann aktualisieren asynchron die Datenbank, wenn eine DoSync Transaktion erfolgreich ist. Ich habe keine Ahnung, ob ich obwohl dies der richtige Weg mache, oder ob es eine bessere Standard-Technik, dies zu tun. Könnte jemand mir erklären, wie sie die ACI Eigenschaften von STM in ACID in ihren Clojure Programme?

machen
War es hilfreich?

Lösung

Im Allgemeinen Hinzufügen des ‚D‘ in ACID zu jedem Programm ist nicht trivial und hängt von den Anforderungen des Programms. Es gibt eine wichtige Spezifikation, dass der Bedarf bestimmt werden, bevor die Implementierung bestimmt werden kann.

Gibt es multi-threaded / Multi-Prozess-Zugriff auf die Datenbank?

Von der Frage Körper, erscheint Ihr Programm nur beim Start und Schreiben nach einer Änderung des STM lesen, in dem die Datenbank die Werte in der STM durch eine kleine Menge von Zeit hinken würde. Allerdings , wenn die Datenbank von anderen Programmen mit anderen Instanzen des Programms zugegriffen wird, dann müssen Sie Schlösser verwenden, wo Sie Zugriff auf die Datenbank direkt vor den Transaktionen sperren und entsperren nach dem Schreiben auf dem Datenbank (als eine Randnotiz, beachten Sie, dass die Datenbank in Ihrem Fall kann alles sein, in dem Dateisystem einer einfachen Datei einschließlich). Es gibt keinen Weg, um dieses, wenn Sie mehrere Lese- und Schreibvorgänge haben, weil sie beide Nebenwirkungen sind, die die Datenbank betreffen.

Wenn es nicht möglich, mehrere Zugang ist , dann asynchrones Schreiben ist in Ordnung, da der Code immer arbeiten, um gewährleistet ist, da Ihr Programm Single-Threaded ist, wenn in dem Zugriff kommt.

Wenn Sie nur mehr Schreib Threads und nicht liest nach dem Start mit nur einer einzigen Instanz , dann müssen Sie nur korrekten Schreib, um zu gewährleisten. Sie können mit Mitteln, tun dies, wo der Agent im Grunde eine Warteschlange von Schreiboperationen in der Datenbank ist. Sie wickeln die DoSync um die Referenztransaktionen und den Agenten, Sie Haltbarkeit neben Ausdauer zu geben.

Generell ist die mehr die Anforderungen kompliziert, die Nebenwirkungen beinhalten, desto mehr Tricks, die Sie tun müssen, um ACID zu gewährleisten. Wenn Sie weitere Anforderungen haben, dann die Implementierungen Ich habe vielleicht zu ändern haben.

EDIT:

(def db-agent (agent dummy-value))
(defn db-write [_ data] ;; make this intelligent to handle when db is not up
    (try
        (write-to-db data)
    (catch ... database fails, do a retry or let user know of problem))
    _)
;; in the transaction code
(dosync
    (alter my-ref ...)
    (send-off db-agent db-write @my-ref)) ;; ensure db gets written to

Andere Tipps

Sie könnte dich interessieren:

  1. Alyssa Kwan modifizierte Clojure Kern, der Ausdauer Refs fügt finden Sie unter: ANN: Durable Refs mit ACID Garantien - Phase I , ANN: Durable Clojure Phase II - - Persistent Strukturen Daten , ANN: Durable Clojure - Funktionen und Closures

  2. Sergey Didenko Bibliothek, die keine starke Haltbarkeitsgarantie nicht geben, ist aber ganz in der Nähe, dass: Simple-Persistence-for-Clojure

Die anderen Ansätze können für Programmierer nicht so transparent sein.

Das STM-Modell ist sehr gut geeignet, um Mehrfachzugriff auf Systeme Tracking wie sie sich ändern. Es ist weniger direkt auf Datenpersistenz geeignet, bei denen die Veränderungen zugänglich über das Leben der Fäden sein müssen, die sie zugreifen.

Es ist im Allgemeinen gut über die ‚D‘ in ACID zu denken, getrennt von der STM

Wenn Sie eine Datenbank mögen, die schnell im Speicher Zugriff hat, und bleibt hinter den Kulissen von Zeit zu Zeit, dann mit einem realen Daten zu speichern, anstatt zu versuchen, Ihre eigenen zu bauen, der eine ziemlich große Aufgabe wäre.

Redis und MongoDB zwei gute Möglichkeiten, aber es gibt viele andere. Sie können Clojure Bibliotheken unter https://github.com/ragnard/redis-clojure finden und < a href = "https://github.com/somnium/congomongo" rel = "nofollow"> https://github.com/somnium/congomongo für Redis und Mongo sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top