2009-01-13 4 views
15

Ich brauche Ideen, um eine (wirklich) hochleistungsfähige In-Memory-Datenbank/Speichermechanismus in Java zu implementieren. Im Bereich der Speicherung von mehr als 20.000 Java-Objekten, alle 5 Sekunden aktualisiert.
Einige Optionen Ich bin offen für:Datenbank mit höchster Performance in Java

reine JDBC/Datenbank Kombination

JDO

JPA/ORM/Datenbank Kombination

einer Objektdatenbank

Andere Speichermechanismen

Was ist meine beste Option? Was sind deine Erfahrungen?

EDIT: Ich brauche auch diese Objekte in der Lage sein möchte Abfrage

Antwort

12

Sie könnten versuchen, etwas wie Prevayler (im Grunde ein In-Memory-Cache, Serialisierung und Sicherung für Sie so behandelt, damit Daten persistent und ist Transaktionssicherheit). Es gibt andere ähnliche Projekte. Ich habe es für ein großes Projekt verwendet, es ist sicher und extrem schnell.

Wenn es die gleiche Menge von 20.000 Objekten ist, oder nicht mindestens 20.000 neue Objekte alle 5 Sekunden, aber viele Änderungen, sollten Sie die Änderungen im Cache speichern und die Änderungen regelmäßig im Batch-Modus schreiben (jdbc Batch-Updates sind viel schneller als einzelne Zeilenaktualisierungen). Das hängt davon ab, ob Sie jede Schreiboperation für Transaktionen verwenden müssen und ob Sie eine Aufzeichnung der Änderungsprotokolle benötigen oder nur Änderungen aggregieren müssen.

bearbeiten: wie andere Beiträge Prevayler erwähnt habe ich dachte, dass ich eine Nachricht hinterlassen würde auf, was es tut: Im Grunde erstellen Sie eine durchsuchbare/serialisierbares Objekt (in der Regel eine Karte von einer Art), die in einem Prevayler gewickelt Instanz, die auf Festplatte serialisiert wird. Anstatt Änderungen direkt an Ihrer Map vorzunehmen, nehmen Sie Änderungen vor, indem Sie Ihrer Prevayler-Instanz einen serialisierbaren Datensatz Ihrer Änderung senden (nur ein Objekt, das die Change-Anweisung enthält). Prevaylers Version einer Transaktion besteht darin, Ihre Serialisierungsänderungen auf die Festplatte zu schreiben, so dass sie im Falle eines Fehlers die letzte vollständige Sicherung laden und dann die Änderungen wieder abspielen kann. Es ist sicher, obwohl Sie genügend Speicher haben müssen, um alle Ihre Daten zu laden, und es ist eine ziemlich alte API, also leider keine generischen Schnittstellen. Aber definitiv stabil und funktioniert wie angekündigt.

+0

Sehr interessiert an Prevayler ... Kennen Sie gute Tutorials? – systemoutprintln

+0

Die Dokumentation auf der Website ist nicht sehr umfangreich, aber der Bibliotheksdownload enthält Demos. Die Verwendung ist ziemlich einfach. –

+0

Steve, könntest du bitte meine Frage zu Prevayler lesen? http://stackoverflow.com/questions/454294/what-are-synchronizing-strategies-for-prevayler – Sergey

4

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

http://hsqldb.org/

1

Wenn Sie alle speichern möchten Ihrer Daten im Speicher möchten Sie vielleicht Prevayler betrachten.

Ich habe es nie selbst verwendet, aber es scheint eine viel bessere Lösung als die Verwendung einer relationalen Datenbank für die Fälle, in denen alle Ihre Daten im Speicher gespeichert werden können.

7

Ich weiß nicht, ob es die schnellste Option ist, aber ich war sehr zufrieden mit H2, wann immer ich es benutzt habe. Es wurde von derselben Person geschrieben, die ursprünglich Hypersonic (später HSQLDB) geschrieben hat.

Eine andere Option, die angeblich sehr schnell ist, ist Prevayler.

+0

Prevayler ist keine Datenbank: http://www.prevayler.org/wiki.jsp? topic = PrevaylerIsNotADatabase – nes1983

+1

Hängt von Ihrer Definition von "Datenbank" ab. Es ist definitiv keine relationale Datenbank, aber es scheint die minimale Definition einer Datenbank zu erfüllen. –

+0

Nun, ich denke, das stimmt. was ich meinte war, dass es nur so viele Daten enthält, wie du im RAM haben kannst. – nes1983

1

Berkeley DB for Java ist eine schnelle Speicherdatenbank, extrem nützlich für einfache Objektdiagramme.

+2

Hmmh. BDB ist KEINE In-Memory-Datenbank, sondern eine Festplatte. Es kann natürlich viele/den größten Teil seines Inhalts im Speicher zwischenspeichern, wie alle produktionsfertigen DBs, aber ich weiß nicht, ob es sogar einen Nur-Speicher-Modus hat. – StaxMan

2

Terrakotta könnte auch eine Antwort für Sie sein. Es ermöglicht mehreren VMs, Objekte zu teilen, damit Sie Last etc verteilen können ...

8

Ich empfehle dringend H2. Dies ist eine Art "Second Generation" Version der HSQLDB, die von einem der ursprünglichen Autoren erstellt wurde. H2 ermöglicht uns Unit-Test unserer DAO-Schicht ohne eine tatsächliche PostgreSQL-Datenbank, die genial ist.

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

+0

unterstützt diese Multithreads? – MadMad666

0

Sie können CSQL versuchen (erhältlich unter Open Source und Enterprise-Version) Es bietet eine 30-fache Leistungssteigerung gegenüber plattenbasierten Datenbanksystemen und bietet JDBC-Schnittstelle. Es kann so konfiguriert werden, dass es als eigenständige Hauptspeicherdatenbank oder als transparenter Cache für MySQL-, Postgres- und Oracle-Datenbanken arbeitet.

+0

Könnten Sie mir einen Link zur Open Source-Version zur Verfügung stellen? – systemoutprintln

1

H2 ist wirklich fantastisch überprüfen können, in der Tat, haben sie im Speicher, normalen Server und Transaktions-, Sie alle. Allerdings vergleicht es nicht in der Leistung mit den Objektdatenbanken, ich sehe Db4o erwähnt, ich hatte tatsächlich viel bessere Leistung mit Neodatis in der Tat, und alles ist schön in Maven-Repositories eingerichtet. Obwohl nicht sehr robust, wie ein Ferrari, schnell, aber kein LKW wie Oracle.

5

Es ist ein bisschen eine alte Frage, aber heutzutage gibt es eine ganze Reihe von Datenbanken, die eine Leistung von 20.000/s haben. Welche Datenbank ausgewählt werden soll, hängt von der Datenstruktur und der Art der Abfragen ab, die Sie vornehmen möchten. Es hängt auch vom Gesamtvolumen ab.

Wir hatten ähnliches Problem mit großen Volumen von Zeitreihendaten, etwa 300.000 rec/s und wir am Ende schreiben eine neue Datenbank NFSdb, mit einfach genug API und anständige Leistung. Es kann etwa 2.000.000 Objektschreibvorgänge durchführen, und wir haben ohne ORM auskommen lassen. Speicher-API sieht ungefähr 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(); 
} 
+0

Ahh .. das ist die Anstrengung, nach der ich gesucht habe. – kromit

+1

Als ich versuchte auf der Website zu gehen, bekam ich "Fehler beim Aufbau einer Datenbankverbindung" .. Die Ironie! –

+0

Es sieht so aus, als wäre es nach https://www.questdb.org/ verschoben worden –

3

Chronicle Map ist eine integrierbare reine Java persistente Datenbank, ein einfaches java.util.Map Interface. Es widersteht etwa 1 Million Abfragen/Updates pro Sekunde aus einem einzigen Thread, konsistente Lese-/Schreibleistung und skaliert fast linear auf die Anzahl der Kerne in der Maschine.

Hier sind einige jüngste Performance Forschung mit aktuellen Zahlen: