Confronto di database incorporati Java [chiuso]


99

Ho intenzione di sviluppare una piccola applicazione (Java) per la gestione delle mie finanze. Credo di aver bisogno di utilizzare un database incorporato, ma non ho esperienza in merito a questo problema. Ho provato a guardare alcuni dei prodotti disponibili , ma non riesco a decidere quale sarebbe più adatto a me. H2 , HSQLDB , Derby e Berkeley DB sembrano essere buoni candidati, ma ancora non vedo come si confrontino tra loro. Apprezzo il tuo aiuto confrontandoli e aiutandomi a decidere quale usare.

Ho intenzione di utilizzare Hibernate per la mia applicazione (a meno che non si consiglia di utilizzare l'API fornita da DBMS), ma desidero anche avere la possibilità di modificare facilmente il database utilizzando uno strumento di navigazione SQL (modifica dello schema e modifica dei dati).

Grazie.


Senza sapere cosa stai cercando di fare, non è possibile rispondere a questa domanda. Suggerisco di aggiornare la domanda con informazioni sulla dimensione del tuo progetto, quante tabelle pensi di avere, quanti record, ecc.
Programmatore fuorilegge,

3
possibile duplicato di database java incorporati
Hosam Aly


5
È fastidioso che queste buone domande vengano chiuse dai nazisti. Certo, alcune domande vaghe non sono adatte, ma questa sicuramente lo è. Dove "Adatto" significa utile per la comunità, piuttosto che con alcune definizioni legalistiche.
Tuntable

Risposte:


60

O

  • HSQLDB - Utilizzato da OpenOffice, testato e stabile. È facile da usare. Se vuoi modificare i tuoi dati db, puoi semplicemente aprire il file e modificare le istruzioni di inserimento.

o

  • H2 - Si dice che sia più veloce (dallo sviluppatore, che originariamente ha progettato anche hsqldb)

Quale usare dipende da te, a seconda di quante prestazioni e quanta stabilità hai bisogno.

Lo sviluppatore di H2 ha fornito una buona valutazione delle prestazioni:
http://www.h2database.com/html/performance.html


35

Uso Apache Derby per quasi tutte le mie esigenze di database incorporato. È inoltre possibile utilizzare il database Java di Sun basato su Derby, ma l'ultima versione di Derby è molto più recente. Supporta molte opzioni supportate dai database nativi commerciali, ma è molto più piccolo e più facile da incorporare. Ho avuto alcune tabelle di database con più di un milione di record senza problemi.

Ho usato per usare HSQLDB e Hypersonic circa 3 anni fa. Al momento ha alcuni grossi problemi di prestazioni e io passo a Derby a causa di questi problemi. Derby è stato solido anche quando era nell'incubatrice ad Apache.


Derby sarebbe fantastico se non fosse per il fatto che ci sono così tanti bug e l'ultimo aggiornamento è stato diversi anni fa.
Hooli

2
@Hooli non posso attestare i bug, ma "... l'ultimo aggiornamento è stato diversi anni fa" non è corretto. Relativamente al momento in cui hai pubblicato il tuo commento ( agosto 2016 ): c'è stato un rilascio meno di un anno prima ( ottobre 2015 ), un rilascio due mesi dopo ( ottobre 2016 ) e un rilascio poco più di un anno dopo ( ottobre 2017 - Ultimo ).
Slaw

Aggiornamento di questo commento nel caso in cui qualcun altro incontri questo argomento durante una ricerca. La versione più recente di Derby è stata a marzo / 2019. Ecco le informazioni sul loro sito: db.apache.org/derby
JavaJd

@ Chris Dail Hai usato derby per milioni di record come un normale database o in memoria o per qualche caching?
Shreyans jain

30

Avevo bisogno di utilizzare il database incorporato Java in uno dei miei progetti e ho svolto molte ricerche per comprendere i pro ei contro di ciascun database. Ho scritto un blog che elenca i pro ei contro dei popolari database java incorporati (H2, HSQLDB, Derby, ObjectDB, Neo4j, OrientDB), puoi dargli un'occhiata. Ho scelto H2 perché pensavo fosse più adatto alle mie esigenze. Link per il blog: http://sayrohan.blogspot.in/2012/12/choosing-light-weight-java-database.html Spero che aiuti!



14

HSQLDB è un buon candidato (il fatto che venga utilizzato in OpenOffice potrebbe convincere alcuni di voi), ma per un'applicazione personale così piccola, perché non utilizzare un database a oggetti (invece di un database relazionale classico)?

Ho utilizzato DB4O in uno dei miei progetti e ne sono molto soddisfatto. Essendo orientato agli oggetti, non è necessario l'intero livello Hibernate e puoi inserire / aggiornare / eliminare / interrogare direttamente gli oggetti! Inoltre, non devi preoccuparti dello schema, lavori direttamente con gli oggetti e DB4O fa il resto!

Sono d'accordo che potrebbe volerci del tempo per abituarsi a questo nuovo tipo di database, ma controlla il tutorial DB40 per vedere quanto è facile lavorare con il DB!

EDIT: come detto nei commenti, DB4O gestisce automaticamente le versioni più recenti delle classi. Inoltre, uno strumento per la navigazione e l'aggiornamento del database al di fuori dell'applicazione è disponibile qui: http://code.google.com/p/db4o-om/


2
Grazie. DB4O sembra buono per un progetto così piccolo, ma credo che la capacità di sfogliare e modificare i dati al di fuori dell'applicazione sia molto importante. Inoltre sarebbe facile gestire le versioni più recenti delle classi? (es. campi aggiunti / rimossi)
Hosam Aly

Come detto nella mia modifica, esiste uno strumento per sfogliare e modificare il DB al di fuori dell'applicazione. E come ha detto Fabian, le versioni più recenti delle classi vengono gestite automaticamente.
Wookai,

Grazie per l'aggiornamento. Avere uno strumento di navigazione è stato molto importante per me, quindi grazie mille.
Hosam Aly

12

Java DB (la distribuzione Sun di Apache Derby) ora viene fornito in JDK 6!

Volevo fare qualcosa come Jason Cohen e ho pensato che questo sembra il modo più semplice per essere nella distribuzione JDK (che della scorsa settimana è ora un requisito per la mia app). O forse sono solo pigro in quel modo.


Probabilmente hai ragione! Abbiamo l'obbligo di funzionare anche con Java 1.5, quindi questa non è un'opzione per noi.
Jason Cohen,

... Volevo dire che avevi ragione sul fatto che fosse il modo più semplice, non giusto sull'essere pigri. :-P
Jason Cohen,

Java DB viene fornito solo con le implementazioni Sun / Oracle di JDK. Non è una parte standard di Java.
Basil Bourque

7

Usiamo HSQLDB in produzione come opzione di "non configurazione" per la nostra applicazione. Permette alle persone di provare senza il fastidio di creare un vero database.

Tuttavia non lo supportiamo per il normale utilizzo. I motivi sono diversi:

  1. Rallenta proporzionalmente alla dimensione dei dati.
  2. Difficile accedere al di fuori della nostra app (ad es. Per rapporti personalizzati).
  3. Le transazioni / sincronizzazione del disco sono difficili da ottenere correttamente, quindi è facile perdere dati.

Per almeno (2) e (3), ci sono modi per aggirarlo ma è difficile; è molto più facile, ad esempio, installare MySQL.


7

neo4j è:

un motore di persistenza Java integrato, basato su disco e completamente transazionale che memorizza i dati strutturati in grafici anziché in tabelle

Non ho ancora avuto la possibilità di provarlo, ma sembra molto promettente. Nota che questo non è un database SQL: il tuo oggetto grafico è persistente per te, quindi potrebbe non essere appropriato per la tua app esistente.



5

Molte cose sono già state dette, ma posso solo aggiungere che ho usato HSQL, Derby e Berkely DB in alcuni dei miei progetti preferiti e hanno funzionato tutti bene. Quindi non penso che importi davvero molto essere onesti. Una cosa degna di nota è che HSQL si salva come file di testo con istruzioni SQL, il che è abbastanza buono. Rende davvero facile quando si sviluppano eseguire test e impostare rapidamente i dati. Può anche fare modifiche rapide, se necessario. Immagino che potresti facilmente trasferire tutto ciò a qualsiasi database se hai bisogno di cambiare anche tu :)


5

HSQLDB può causare problemi per applicazioni di grandi dimensioni, non è così stabile.

Il meglio che ho sentito (non l'esperienza di prima mano tuttavia) è berkleyDB. Ma a meno che non lo usi opensource, ti costerà un braccio e una gamba da usare a causa della licenza ... vedi questo http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html per dettagli.

ps. berkleyDB non è un database relazionale nel caso non lo sapessi.


Oh, non sapevo che Berkeley non fosse un database relazionale! Molte grazie!
Hosam Aly

non significa che non sia buono. ma sospetto che sia probabilmente troppo buono per il tuo uso considerando che è per qualcosa di personale. inoltre, dai un'occhiata a sqlite. Penso che abbia collegamenti Java, ma non riesco a trovarlo atm.
Chii

4

Sono un grande fan di DB4O sia per .Net che per Java .

Le prestazioni sono migliorate notevolmente dalle prime versioni. Anche il modello di licenza non è male. Mi piacciono particolarmente le opzioni disponibili per interrogare i tuoi oggetti. La query per esempio è molto potente e facile da usare.


4

Quali criteri utilizzerai per valutarli? Se non lo sai ancora, non hai bisogno di decidere adesso. Cerca di rendere la tua applicazione il più indipendente possibile dall'implementazione del database, fornendo i wrapper appropriati, gli oggetti di accesso ai dati ecc. E prendi questa decisione quando hai tutti i fatti a portata di mano e devi decidere.

Se stai usando database relazionali e SQL, quanto sopra non dovrebbe essere troppo difficile (usando JDBC ecc.). Assicurati di avere molti test circostanti in modo che quando vuoi passare da un database all'altro, puoi determinare che la funzionalità della tua applicazione rimane la stessa.

Ho riscontrato lo stesso problema qualche tempo fa. Non sapevo quale database scegliere, quindi la mia prima soluzione utilizzava Derby (o HSQLDB?), E in seguito sono stato in grado di passare a HSQLDB (o Derby? Non ricordo quale soluzione ha funzionato) una volta determinato dove Ho avuto problemi (relativi alle prestazioni) e quale soluzione avrebbe funzionato davvero per me.


3

Ho usato Derby e odio davvero le sue funzioni di conversione del tipo di dati, in particolare le funzioni di data / ora. (Tipo di numero) <--> La conversione di Varchar è un dolore.

Quindi, se prevedi di utilizzare conversioni del tipo di dati nelle tue istruzioni DB, considera l'uso di un altro DB incorporato, lo apprendo troppo tardi.

Ultime conversioni del tipo di dati della versione Derby


3

Personalmente preferisco HSQLDB, ma soprattutto perché è stato il primo che ho provato.

Si dice che H2 sia più veloce e fornisce un frontend GUI più carino (che è generico e funziona con qualsiasi driver JDBC, tra l'altro).

Almeno HSQLDB, H2 e Derby forniscono modalità server che sono ottime per lo sviluppo, perché puoi accedere al DB con la tua applicazione e alcuni strumenti allo stesso tempo (che la modalità incorporata di solito non consente).


3

Immagino di essere un po 'in ritardo (molto in ritardo ;-)) a questo post, ma vorrei aggiungere Perst, un database embedded open source e orientato agli oggetti per Java e .NET. per la tua considerazione. Perst è un database integrato open source / doppia licenza per Java. La distribuzione è compatibile con la piattaforma Android di Google e include anche Perst Lite per Java ME. Abbiamo persino creato un benchmark Android e prodotto un white paper sull'argomento ... puoi dare un'occhiata qui: http://www.mcobject.com/index.cfm?fuseaction=download&pageid=581§ionid=133

Ti auguro il meglio, Chris


3

Se ho ragione, H2 è degli stessi ragazzi che hanno scritto HSQLDB. È molto meglio se ti fidi dei benchmark sul loro sito. Inoltre, c'è qualche idea che la comunità del sole sia entrata troppo rapidamente nel Derby.


2
Quali sono le nozioni premature del derby che preoccupano con DerbyDB? Scadenza?
Simgineer

2

Mi rendo conto che hai menzionato la navigazione SQL, ma tutto il resto nella tua domanda mi fa venir voglia di suggerirti di considerare anche DB4O , che è un grande e semplice DB di oggetti .


Grazie. DB4O sembra buono per un progetto così piccolo, ma credo che la capacità di sfogliare e modificare i dati al di fuori dell'applicazione sia molto importante. Inoltre sarebbe facile gestire le versioni più recenti delle classi? (es. campi aggiunti / rimossi)
Hosam Aly,

Sì, supporta automaticamente alcuni refactoring, puoi trovare ulteriori informazioni al riguardo qui: ibm.com/developerworks/java/library/j-db4o3.html
Fabian Steeg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.