2010-04-07 11 views
10

Sto progettando un'applicazione web basata su Java e ho bisogno di un archivio di valori-chiave. Berkeley DB sembra abbastanza appropriato per me, ma sembra che ci siano due DB Berkeley tra cui scegliere: Berkeley DB Core implementato in C e Berkeley DB Java Edition implementato in puro Java.Scegliere tra Berkeley DB Core e Berkeley DB JE

La domanda è, come scegliere quale utilizzare? Con la scalabilità e le prestazioni delle applicazioni web è abbastanza importante (chissà, forse la mia idea diventerà il prossimo Youtube) e non sono riuscito a trovare facilmente dei benchmark significativi tra i due. Devo ancora familiarizzare con l'API Java di Cores, ma trovo difficile credere che potrebbe essere molto peggio di Java Editions, che sembra essere abbastanza carino.

Se qualche altro negozio con valore-chiave sarebbe molto meglio, sentitevi liberi di raccomandarlo anche voi. Sto memorizzando piccoli binari binari e le chiavi probabilmente saranno hash dei dati o qualche altro ID univoco.

risposta

2

Se si ottiene un'interfaccia comune a questi e si dispone di un set adeguato di test di unità, si dovrebbe essere in grado di scambiare tra i due banalmente in un secondo momento (forse quando è davvero necessario prendere una decisione basata su fatti concreti non disponibile al momento)

+2

Solo un avvertimento: i database stessi * non * saranno portatili tra le versioni. Se segui questa strada, avrai bisogno di una strategia di migrazione per i dati stessi se ti accorgerai di voler scambiare le implementazioni. Per questo motivo, se la portabilità dei dati è importante, è meglio andare con Berkeley DB e Java API su Java Edition. – Shaun

2

Ho affrontato lo stesso problema e ho deciso di utilizzare l'edizione Java, principalmente per la sua portabilità (ho bisogno di qualcosa che possa essere eseguito anche su dispositivi mobili). Ci sono anche le API Direct Persistence Layer (DPL) e il fatto che l'intero db sia un singolo jar rende la sua distribuzione abbastanza semplice.

La recente versione 4 ha apportato alta disponibilità e miglioramenti delle prestazioni. C'è anche il fatto che le applicazioni java di lunga durata possono ottenere tale ottimizzazione, che supererebbero le prestazioni delle applicazioni C native in alcuni scenari.

È una soluzione naturale per qualsiasi applicazione Java, desktop o web.

2

Ho avuto la stessa domanda, dopo aver fatto alcuni benchmark ho scoperto che la modalità hash nella versione nativa è molto più veloce e efficiente rispetto a qualsiasi altra cosa l'edizione java ha da offrire, così ho deciso di andare con il nativo implementazione.

Ti suggerisco di fare i tuoi benchmark per le capacità di archiviazione che ti aspetti e decidere se l'edizione Java è abbastanza veloce.

se lo è, o se le prestazioni non sono un grosso problema per te (è fondamentale per me), basta andare con l'edizione Java. altrimenti vai con quello nativo (supponendo che tu veda lo stesso incremento di prestazioni per il tuo caso d'uso).

btw: il mio benchmark è stato testare la velocità di interrogare chiavi casuali su 20.000.000 di record, in cui la chiave è una stringa e il valore è un int (4 byte). Ho visto che gli inserti (che compongono il benchmark) erano molto più veloci con la versione nativa e le query erano due volte più veloci.

(Ciò non è dovuto alla mancanza di Java, ma perché la versione di Java non è della stessa versione della versione nativa - 4.0 vs 4.8 IIRC).

12

Ho un bel po 'di esperienza usando sia BDB-JE che BDB-core con Java. Decidere quale usare è abbastanza semplice: se vuoi la concorrenza, usa BDB-JE. Se si desidera la scalabilità, utilizzare BDB-core.

BDB-JE rompe le prestazioni con database di grandi dimensioni a causa del suo formato di file e della sua dipendenza dalla garbage collection Java per ripulire le voci della cache sfrattate. Aspettati lunghe pause nella raccolta dei rifiuti o dedica molto tempo alla regolazione delle impostazioni GC magiche.Anche il formato del file ha dei problemi, perché i thread del pulitore dello sfondo devono passare molto tempo a ripulire i rifiuti creati dai primi sfratti della cache. Se il tuo database si adatta alla RAM, BDB-JE funziona abbastanza bene.

BDB-core si basa su una strategia di blocco della pagina e le applicazioni altamente concorrenti presentano molti deadlock. Se è possibile ordinare in modo casuale le operazioni riduce il potenziale di deadlock, ma non lo elimina mai. Poiché BDB-core memorizza i dati in un modo più tradizionale, si adatta a dimensioni molto grandi con un peggioramento delle prestazioni prevedibile e previsto. Poiché la sua cache non è gestita da un garbage collector, può essere abbastanza grande e non causare alcuna pausa.

1

Ho deciso di andare con l'edizione Java, semplicemente perché è possibile incorporare il runtime del database all'interno dello stesso distribuibile. Questa è stata una caratteristica importante per il mio setup. Non ho fatto un benchmark tra core e JE, ma ho visto prestazioni eccellenti rispetto ad altri negozi di valore-chiave che ho testato durante la prima valutazione degli archivi di database.

Se stai creando un'applicazione Web, la concorrenza potrebbe essere molto importante per te nel lungo periodo.

Problemi correlati