2012-03-19 18 views
21

Recentemente ho fatto una domanda su Neo4j, che ho funzionato e che mi sembra carino. È integrabile ed è scritto in Java e non ci sono (troppo) molte dipendenze.Quale DB incorporato scritto in Java per un semplice archivio di chiavi/valori?

Tuttavia è un DB grafico e non so se è una buona idea o non usarlo come un semplice negozio di chiavi/valori.

Fondamentalmente io ho una grande mappa, che in Java sarebbe simile a questa:

Map<Integer,Map<String,String>> 

Ho un paio di decine di milioni di voci nella mappa principale e ogni voce in sé contiene una mappa di proprietà/valori. La mappa "interna" è relativamente piccola: circa 20 voci.

Ho bisogno di un modo per mantenere quella mappa da in esecuzione della webapp all'altra.

Utilizzando Neo4j, ciò che ho fatto è creare un nodo per ogni ID (numero intero) e quindi inserire una proprietà per ogni voce all'interno della mappa interna. Dai miei primi test sembra funzionare ma non sono sicuro che sia un buon modo per procedere.

Quale DB integrabile, scritto in Java, utilizzeresti?

I requisiti sono:

  • scritto in Java

  • embeddable (quindi niente di troppo grande)

  • non SQL (*)

  • open source

  • facile per il backup (ho bisogno di essere in grado di fare copie di backup "live", mentre il server è in esecuzione)

mia terminologia può essere un po 'sbagliato troppo, quindi sentitevi liberi di aiutarmi/correggetemi . Per la mia "mappa delle mappe", la soluzione migliore sarebbe un DB coppia/valore giusto?

io sono un po 'perso come la differenza tra coppie chiave/valore DB, Documento DB, grandi tavoli, grafico DB, ecc

mi piacerebbe anche se è una buona idea di utilizzare un grafico DB come Neo4J per il mio bisogno (penso che le prestazioni non saranno un problema visto il numero relativamente basso di voci che avrò).

Ovviamente I potrebbe semplicemente mantenere la mia mappa di mappe ma non voglio reinventare nessuna ruota qui. Voglio riutilizzare un DB provato e provato ...

(*) Il motivo per cui non voglio SQL è che avrò sempre questa "mappa delle mappe" e che la mappa interna si evolverà costantemente, quindi non voglio qualcosa di troppo strutturato.

+0

è la mappa interna altamente probabile che sia diversa in ogni voce della mappa principale, o ci sarà una notevole quantità di sovrapposizione tra le mappe interne della mappa principale? Esistono diversi percorsi che è possibile eseguire, ma in realtà dipende dalla quantità di replica referenziale all'interno della struttura. – cdeszaq

+0

@cdeszaq: grazie per il tuo commento e aiuto ... La mappa interna deve avere lo stesso numero di proprietà e le stesse proprietà, ma il valore di ciascuna proprietà sarà leggermente diverso. Direi piuttosto un po 'di sovrapposizione, ma non credo che le prestazioni rappresenteranno una preoccupazione maggiore: sto cercando qualcosa di più comodo/piccolo/facile da fare. Pensi che Neo4j lavorerebbe qui? So che ci sono diverse opzioni: così tante che sono un po 'perso:) –

+0

@cdeszaq: Ho dimenticato di menzionare: le proprietà della mappa interna devono "evolversi" durante la vita dell'app: verranno aggiunte nuove proprietà (e le voci vecchie, che non hanno queste nuove proprietà, devono essere impostate automaticamente su un valore predefinito quando interrogate per una proprietà inesistente). Quindi c'è sovrapposizione ma non è "strutturata" in quanto non esiste uno schema fisso (se ho la terminologia giusta). –

risposta

5

Si potrebbe guardare in Berkeley DB

http://docs.oracle.com/cd/E17277_02/html/GettingStartedGuide/index.html

E 'abbastanza efficace a trattare con grandi quantità di dati ed è chiave/valore. Non posso davvero dire di più a questo proposito dal momento che sto scoprendo io stesso, ma se avete tempo di dare uno sguardo in esso ...

+0

Stavo per risponderti * "sì, Berkeley è sempre gentile ma è scritto in C" * e poi mi rendo conto che al giorno d'oggi esiste una * "Berkeley DB Java edition" * interamente scritta in Java e open source ... Potrebbe essere interessante. –

+0

È puro Java ... il problema è una licenza ostile al (piccolo) business del software. –

13
Ci

sembra essere un paio di porti di Google di LevelDB in Java:

Poi c'è tutta una serie di incorporato Java base dati quì:

+0

questi sono ottimi collegamenti ... Ci sarebbero alcuni di quelli che consiglieresti nel mio caso specifico? –

+0

@CedricMartin Consiglio vivamente LevelDB se si desidera un database integrato leggero ed estremamente veloce. Per ottenere le massime prestazioni da LevelDB, provare ad accedere alle chiavi in ​​ordine sequenziale utilizzando l'iteratore anziché ottenere (Iterator.Seek vs DB.Get). LevelDB è molto veloce per letture/scritture casuali, ma è altamente ottimizzato per letture/scritture sequenziali. Inoltre, LevelDB è molto resiliente ai guasti e ha funzioni integrate per riparare il database se non è possibile aprirlo. – Kiril

2

Si potrebbe solo bastone con un file XML o JSON. Nessuno di quelli richiede uno schema ed è abbastanza facile andare avanti e indietro tra il disco e la memoria, soprattutto se le prestazioni davvero non contano troppo. (ad esempio si caricano solo configurazioni di tanto in tanto)

Il vantaggio è che XML e JSON sono entrambi molto semplici e gestiscono abbastanza bene Maps.

Hai anche un carico di dipendenza molto più leggero sulla tua applicazione. Un intero sistema di tipo DB incorporato è piuttosto pesante se si sta solo persistendo/non persistendo in una grande struttura dati quando è necessario e non si utilizza nessuna delle query o funzionalità simili aggiunte dalla maggior parte delle soluzioni incorporate.

Per soddisfare le vostre esigenze, è in gran parte integrato in Java, facile da eseguire il backup, poiché è solo un file, altamente integrato, molto open source e non SQL. L'XML può essere un po 'prolisso e prolisso, a volte, ma è un dominio ben noto e ha molti strumenti che lo circondano, in modo che tu possa gestirlo esternamente all'app se necessario.

+0

bene ho preso in considerazione XStream e sono sicuro che ci sono altri modi per farlo, ma sembra un po '"di basso livello". Dovrei occuparmi di "transazioni" non riuscite, stato potenzialmente incoerente se il cavo di alimentazione viene rimosso durante la scrittura di un file XML, ecc. Inoltre avrò alcune decine di milioni di voci (come ho scritto nella mia domanda), quindi Non sono sicuro che XML o JSON sarebbero così "leggeri" in questo caso (o avrei bisogno di un sacco di file XML o mettere diverse voci nello stesso file). XML o JSON è un'opzione ma al momento Neo4j è in esecuzione e sembra relativamente leggero. –

+0

Sì, è un po 'di basso livello, ma non richiede altre dipendenze. E se sei preoccupato per i guasti di alimentazione a metà scrittura e transazioni, ecc., Metterei in discussione l'uso di quasi ogni soluzione embedded. Infine, se hai qualcosa che funziona, usalo solo finché non puoi dimostrare che hai bisogno di qualcos'altro.Se Neo4j funziona e soddisfa le tue esigenze, usalo e passa a questioni più importanti. Esegui prima la porta, poi itera una volta che hai un vero feedback. Fino ad allora, stai solo indovinando. – cdeszaq

+0

* "se si è preoccupati per interruzioni di alimentazione a metà scrittura e transazioni, ecc., Metterei in dubbio l'utilizzo di qualsiasi soluzione incorporata" * ... Kinda. Ma sicuramente alcuni di loro devono avere una protezione migliore contro gli eventi di altri. La cosa è: so che sto indovinando. Mi ci sono volute alcune ore per far funzionare e installare Neo4j e mi chiedevo di poter provare a confrontarmi. Oh bene, seguirò il tuo consiglio e rimarrò con Neo4j sin da ora, anche se non ho bisogno della funzione "grafico". La prossima cosa che proverò se incontrerò il problema sarà "Berkeley DB Java edition":) –

11

Per utilizzare il caso mi sento di raccomandare MapDB (http://www.mapdb.org)

Esso soddisfa le vostre esigenze:

  • scritto in Java
  • embeddable - singolo vaso senza dipendenze
  • non
  • SQL - fornisce mappe permanenti sul disco
  • open source (licenza Apache 2)
  • facile per il backup (pochi) file

e ha altre funzioni molto comode come le transazioni, la concorrenza e le prestazioni.

6

Chronicle-Map è un nuovo giocatore piacevole in questo campo.

  • È off-heap residente (con capacità per essere persistito su disco per mezzo di file mappati in memoria) Map implementazione
  • super-veloce - sostiene milioni di query/aggiornamenti al secondo, i. e.ogni query ha latenza inferiore al microsecondo in media
  • Supporta gli aggiornamenti simultanei (presume essere un drop-in sostituzione di ConcurrentHashMap)
  • sostegno speciale di mappe di proprietà che hai citato, se l'insieme delle proprietà è fissato all'interno della collezione - consente di aggiornare proprietà specifiche del valore senza alcuna serializzazione/deserializzazione dell'intero valore (20 campi). Questa funzione è denominata generazione valore dati in Chronicle/Lang progetto.
  • E molto altro ancora ...
2

Tardi per la parte, ma è possibile utilizzare Tayzgrid. Il suo open source e la sua cache in-process possono essere incorporati nella tua applicazione. Si tratta fondamentalmente di una griglia di dati in memoria o di In Memory Key value store ma ha anche la capacità che si desidera sia un semplice archivio di valori chiave incorporati nel processo.

1

Checkout www.jsondb.io

Questo è un puro Java, embeddable database leggero che memorizza i propri dati sotto forma di file che lo rende facile a sostegno

+0

Molto bello! Grazie per averlo fatto! Supporta inoltre XPath o yeah !!!!!!!!!!!! – GOXR3PLUS