Domanda

Ho bisogno di idee per implementare un meccanismo di archiviazione / database in memoria (davvero) ad alte prestazioni in Java. Nella gamma di memorizzazione di oltre 20.000 oggetti java, aggiornati ogni 5 secondi circa.
Alcune opzioni sono aperte a:

Combinazione JDBC / database pura

JDO

Combinazione JPA / ORM / database

Un database di oggetti

Altri meccanismi di memorizzazione

Qual è la mia migliore opzione? Quali sono le tue esperienze?

EDIT: ho anche bisogno di poter interrogare questi oggetti

È stato utile?

Soluzione

Potresti provare qualcosa come Prevayler (sostanzialmente una cache in memoria che gestisce la serializzazione e il backup per te, quindi i dati persistono e sono sicuri per le transazioni). Ci sono altri progetti simili. L'ho usato per un grande progetto, è sicuro ed estremamente veloce.

Se si tratta dello stesso set di 20.000 oggetti, o almeno non di 20.000 nuovi oggetti ogni 5 secondi, ma molte modifiche, potresti essere meglio memorizzare nella cache le modifiche e scrivere periodicamente le modifiche in modalità batch (gli aggiornamenti batch jdbc sono molto più veloci rispetto agli aggiornamenti delle singole righe). Dipende dal fatto che sia necessario eseguire il wrapping transazionale di ciascuna scrittura e se è necessario un registro dei registri delle modifiche o solo modifiche aggregate.

Modifica : come altri post hanno menzionato Prevayler, ho pensato di lasciare una nota su ciò che fa: Fondamentalmente si crea un oggetto ricercabile / serializzabile (in genere una mappa di qualche tipo) che è racchiuso in un'istanza di Prevayler, che è serializzata su disco. Invece di apportare modifiche direttamente alla tua mappa, fai le modifiche inviando alla tua istanza Prevayler un record serializzabile della tua modifica (solo un oggetto che contiene l'istruzione change). La versione di Prevayler di una transazione è scrivere le modifiche di serializzazione su disco in modo che in caso di errore possa caricare l'ultimo backup completo e quindi riprodurre le modifiche a tale proposito. È sicuro, anche se devi avere abbastanza memoria per caricare tutti i tuoi dati, ed è un'API abbastanza vecchia, quindi sfortunatamente nessuna interfaccia generica. Ma decisamente stabile e funziona come pubblicizzato.

Altri suggerimenti

Consiglio vivamente H2 . Questo è un tipo di "seconda generazione" versione di HSQLDB fatta da uno degli autori originali. H2 ci consente di testare l'unità del nostro livello DAO senza richiedere un vero database PostgreSQL, che è fantastico .

Esiste un gruppo di reti e una mailing list attivi e l'autore Thomas Mueller è molto attento alle domande (ah, piccolo gioco di parole lì.)

Non so se è l'opzione più veloce, ma sono stato molto soddisfatto di H2 ogni volta che l'ho usato. È scritto dalla stessa persona che originariamente ha scritto Hypersonic (che in seguito divenne HSQLDB).

Un'altra opzione che è presumibilmente molto veloce è Prevayler .

È un po 'una vecchia domanda, ma oggigiorno ci sono molti database con un livello di prestazioni di 20.000 / s. Quale database scegliere dipende dalla struttura dei dati e dal tipo di query che si desidera effettuare. Dipende anche dal volume complessivo.

Abbiamo avuto un problema simile con un grande volume di dati relativi a serie storiche, circa 300.000 rec / se abbiamo finito per scrivere un nuovo database NFSdb , con API abbastanza semplici e prestazioni decenti. Può fare circa 2.000.000 di scritture / e di oggetti e abbiamo eliminato senza ORM. L'API di archiviazione è simile a:

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();
}

Prova quanto segue, funziona davvero bene con Hibernate e altri framework ORM

http://hsqldb.org/

Proverei a OrientDB .

Chronicle Map è un database persistente puro Java incorporabile, che fornisce un semplice java .util.Map . Resiste a circa 1 milione query / aggiornamenti al secondo da un singolo thread , prestazioni di lettura / scrittura coerenti e ridimensiona quasi linearmente al numero di core nella macchina.

Ecco alcune recenti ricerche sulla performance con numeri reali:

La terracotta potrebbe anche essere una risposta per te. Consente a più macchine virtuali di condividere oggetti in modo da poter distribuire il carico, ecc ...

Puoi anche dare un'occhiata a db4o

Se si desidera archiviare tutti i dati in memoria, è possibile consultare Prevayler .

Non l'ho mai usato da solo, ma sembra una soluzione molto migliore rispetto all'utilizzo di un database relazionale per quei casi in cui tutti i tuoi dati possono essere archiviati in memoria.

Berkeley DB per Java è un ricordo veloce database, estremamente utile per grafici di oggetti semplici.

hsqldb è abbastanza veloce, ma non è ACID sicuro per le transazioni. Il database java più veloce che conosco è db4o: benchmarks .

Modifica : Notare che Prevayler non è un database, vedere http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase . Se sei a corto di RAM, sei sfortunato.

H2 è davvero fantastico, anzi, in memoria, server normale e transazionale, hai tutto. Tuttavia non si confronta in termini di prestazioni con i database degli oggetti, vedo Db4o menzionato, in effetti ho avuto prestazioni molto migliori con Neodatis e tutto ben impostato nei repository Maven. Sebbene non molto robusto, come una Ferrari, veloce ma non un camion come Oracle.

Puoi provare CSQL (disponibile in versione open source e enterprise) Offre un miglioramento delle prestazioni 30X su disco sistemi di database e fornisce interfaccia JDBC. Può essere configurato per funzionare come database di memoria principale autonomo o come cache trasparente per database MySQL, Postgres, Oracle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top