2 Stimmen

Java - Wie speichert man Objekte asynchron in der Datenbank?

Mögliches Duplikat:
Java: TaskExecutor für asynchrone Datenbank-Schreibvorgänge?

Ich habe eine Karte mit Datenobjekten im Speicher, die ich sehr schnell lesen und beschreiben können muss. Ich möchte, dass diese Objekte über Prozessneustarts hinweg beständig sind, also möchte ich sie in einer DB speichern lassen.

Da ich keine DB-Einfügungen oder Aktualisierungen meine Laufzeit verlangsamen möchte, würde ich sie gerne sofort im Speicher und später asynchron zur DB ausführen lassen. (Für mich ist es sogar akzeptabel, wenn der Prozess abstürzt und ein paar Daten verloren gehen).

Gibt es ein Java-Tool (vorzugsweise Open Source), das diese Fähigkeit "out of the box" bietet? Kann dies einfach mit Hibernate gemacht werden?

4voto

zengr Punkte 37400

Wie ich bereits in meinem Kommentar erwähnt habe, sollten Sie asynchrone Schreibvorgänge benötigen und weder Hibernate noch Ehcache verwenden wollen:

  1. Lauffähig : Die einzige Möglichkeit, eine asynchrone Verarbeitung in Java zu erreichen, besteht in einer einfachen Klasse, die Runnable erweitert:

    public class AsyncDatabaseWriter implements Runnable {
         private LinkedBlockingQueue<Data> queue = ....
         private volatile boolean terminate = false;
         public void run() {
             while(!terminate) {
                Data data = queue.take();
                // write to database
             }
         }
         public void ScheduleWrite(Data data) {
             queue.add(data);
         }
     }

    Auch hier angegeben: Java: TaskExecutor für asynchrone Datenbank-Schreibvorgänge?

  2. Verteilte Arbeiter : Wenn Sie mehr bewegliche Teile in Ihr System einführen wollen, dann können Sie eine Java-Alternative zu einer verteilten Task-Warteschlange ausprobieren wie Staudensellerie : hazelcast o octobot . Dies wird ein Messaging-Tier dazwischen benötigen, das als Warteschlange fungiert, und die Arbeiter werden die Aufgabe des Schreibens in die DB für Sie erledigen. Das sieht nach einem Overkill aus, hängt aber wiederum von Ihrem Anwendungsfall und dem Umfang ab, in dem Sie Ihre Anwendung nutzen wollen. Ich habe etwas sehr ähnliches gemacht, bei dem ich einen Anwendungsfall hatte, bei dem ich asynchron in die DB schreiben musste, also habe ich celery (Python) verwendet. Eine Beispielimplementierung finden Sie hier: Artemis

2voto

Tomasz Nurkiewicz Punkte 322861

Erwägen Sie die Verwendung von Caching hinter dem Schreiben, z. B. in EhCache :

[...] Beim Schreiben von Daten in den Cache speichert der Write-Behind-Cache die geänderten Daten in einer Warteschlange und überlässt es einem Backend-Thread, die Daten später zu schreiben. Daher kann der Cache-Schreibvorgang fortgesetzt werden, ohne auf das Schreiben in die Datenbank zu warten, und ist somit viel schneller abgeschlossen. Alle geänderten Daten können schließlich in der Datenbank persistiert werden. In der Zwischenzeit erhält jeder Lesevorgang aus dem Cache immer noch die neuesten Daten.

Leider weiß ich nicht, wie und ob Write Behind mit Hibernate integriert werden kann (ich glaube nicht).

1voto

Majid Laissi Punkte 18922

In hibernate wählen Sie aus, wann Sie Daten in der Datenbank persistieren wollen, Sie arbeiten hauptsächlich mit proxy Objekte (die Sie im Speicher behalten und bearbeiten können) und rufen Sie save Methode, wenn Sie etwas in die Datenbank einfügen oder aktualisieren wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X