Frage

ich Ideen brauchen eine (wirklich) Hochleistungs-In-Memory-Datenbank / Speichermechanismus in Java zu implementieren. Im Bereich 20.000+ Java-Objekte zu speichern, aktualisiert alle 5 oder so Sekunden.
Einige Optionen Ich bin offen für:

Reine JDBC / Datenbank Kombination

JDO

JPA / ORM / Datenbank Kombination

Eine Objektdatenbank

Andere Speichermechanismen

Was ist meine beste Option? Was sind Ihre Erfahrungen?

EDIT: Ich muss auch in der Lage sein möchten, diese Objekte Abfragen

War es hilfreich?

Lösung

Sie könnten versuchen, so etwas wie Prevayler (im Grunde einen In-Memory-Cache, die Serialisierung und Backup-Griffe für Sie so Daten weiterhin besteht und ist transaktionssicher). Es gibt noch andere ähnliche Projekte. Ich kann es für ein großes Projekt verwendet habe, ist es sicher und extrem schnell.

Wenn es der gleiche Satz von 20.000 Objekten ist, oder zumindest nicht 20.000 neue Objekte alle 5 Sekunden, aber viele Veränderungen, könnten Sie besser dran Cacheing die Änderungen und Schreiben in regelmäßigen Abständen die Änderungen im Batch-Modus (JDBC Batch-Updates ist viel schneller als einzelne Zeile Updates). Hängt davon ab, ob Sie jede Schreib müssen transaktions gewickelt sein, und ob Sie eine Aufzeichnung der Änderungsprotokolle benötigen oder einfach nur Aggregat ändert.

Bearbeiten : wie andere Beiträge haben Prevayler erwähnte ich dachte, dass ich auf eine Nachricht hinterlassen würde, was es tut: Im Grunde erstellen Sie eine durchsuchbare / serialisierbares Objekt (in der Regel eine Karte von einer Art), die in einer Prevayler Instanz gewickelt ist, die auf der Festplatte serialisiert wird. Anstatt Änderungen direkt auf Ihrer Karte machen, machen Sie die Änderungen, indem Sie Ihre Prevayler Instanz eine serializable Aufzeichnung Ihrer Änderung Senden (nur ein Objekt, das den Änderungsbefehl enthält). Prevayler Version einer Transaktion ist Ihre Serialisierung Änderungen auf die Festplatte zu schreiben, so dass im Falle des Scheiterns es die letzte vollständige Sicherung laden und abspielen dann die Änderungen dagegen. Es ist sicher, obwohl Sie genug Speicher haben müssen alle Ihre Daten zu laden, und es ist eine ziemlich alte API, so dass keine generischen Schnittstellen, leider. Aber auf jeden Fall stabil und funktioniert wie beworben.

Andere Tipps

Ich empfehle H2 . Dies ist eine Art „zweite Generation“ -Version von HSQLDB von einem der ursprünglichen Autoren gemacht. H2 ermöglicht es uns, einheits testen unsere DAO Schicht ohne eine tatsächliche PostgreSQL-Datenbank zu erfordern, das ist genial .

Es gibt eine aktive Netzgruppe und Mailingliste, und der Autor Thomas Müller reagiert sehr schnell auf Anfragen (hah, wenig Wortspiel dort.)

Ich weiß nicht, ob es die schnellste Option ist, aber ich habe sehr zufrieden mit H2 , wenn ich es benutzt habe. Es ist von der gleichen Person geschrieben, die ursprünglich schrieben Hypersonic (die später HSQLDB).

Eine weitere Option, die angeblich sehr schnell ist Prevayler .

Es ist ein bisschen eine alte Frage, aber in diesen Tagen gibt es eine ganze Reihe von Datenbanken, die ein Leistungsniveau von 20.000 / s haben. Welche Datenbank zu wählen, hängt von Datenstruktur und die Art der Fragen, die Sie mögen, machen werden. Es hängt auch von Bauvolumen.

Wir hatten ähnliches Problem mit großen Volumen von Zeitreihendaten, etwa 300.000 rec / s und am Ende haben wir eine neue Datenbank NFSdb , mit einfach genug API und ordentlicher Leistung. Es kann nicht etwa 2.000.000 Objekt / s schreibt, und wir haben weg, ohne ORM. Speicher-API sieht etwa so aus:

JournalFactory factory = new JournalFactory("/mnt1/data/tick");

MyObject o = new MyObject();
try (JournalWriter<MyObject> writer = factory.writer(MyObject.class)) {

   o.setBlah(...);
   writer.append(o);

   // more appends here
   //
   writer.commit();
}

Versuchen Sie, die folgenden, führt es wirklich gut mit Hibernate und anderen ORM-Frameworks

http://hsqldb.org/

Ich würde einen Versuch Orientdb .

Chronicle Karte Einbettbares reine Java persistente Datenbank ist ein einfach java.util.Map Interface. Es hält etwa 1 Million Abfragen / Updates pro Sekunde von einem einzigen Thread , konsistente Lese- / Schreibleistung und nahezu linear mit der Anzahl der Kerne in der Maschine skaliert werden kann.

Hier sind einige der jüngsten Performance Forschung mit aktuellen Zahlen:

Terracotta könnte auch eine Antwort für Sie sein. Es kann mehr VMs Objekte teilen, so dass Sie Last verteilen können etc ...

Sie können auch Besuche db4o

Wenn Sie alle Ihre Daten im Speicher gespeichert werden sollen, könnten Sie unter Prevayler .

Ich habe es nie selbst, aber es scheint wie eine viel bessere Lösung als eine relationale Datenbank für die Fälle verwendet, bei dem alle Daten im Speicher gespeichert werden.

Berkeley DB für Java ein schnell im Speicher Datenbank, äußerst nützlich für die einfache Objektgraphen.

Sie können versuchen, cSQL (erhältlich unter Open Source und Enterprise-Version) Es bietet 30X Leistungsverbesserung gegenüber Disk-basierten Datenbanksysteme und bietet JDBC-Schnittstelle. Es kann allein Hauptspeicher-Datenbank zu arbeiten als Standes oder als transparenter Cache zu MySQL, Postgres, Oracle-Datenbanken konfiguriert werden.

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