Höchste Performance-Datenbank in Java
-
22-07-2019 - |
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
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.)
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
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.
hsqldb ist recht schnell, aber es ist nicht ACID transaktionssicher. Die schnellste Java-Datenbank Ich weiß, ist db4o. Benchmarks
Bearbeiten : Bitte beachten Sie, dass Prevayler nicht eine Datenbank finden Sie unter
H2 ist wirklich fantastisch, in der Tat, im Speicher, normale Server und Transaktions-, Sie haben sie alle. Es ist jedoch nicht in der Leistung zu den Objektdatenbanken zu vergleichen, ich sehe Db4o erwähnt, ich habe noch viele bessere Leistung mit Neodatis in der Tat, und alles schön in Maven-Repositories einzurichten. Obwohl es nicht sehr robust, wie ein Ferrari, schnell, aber nicht ein LKW wie Oracle.
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.