Porównanie wbudowanych baz danych Java [zamknięte]

99

Zamierzam stworzyć małą (Java) aplikację do zarządzania moimi finansami. Uważam, że muszę użyć wbudowanej bazy danych, ale nie mam doświadczenia w tej kwestii. Próbowałem przyjrzeć się niektórym z dostępnych produktów , ale nie mogę się zdecydować, który będzie dla mnie bardziej odpowiedni. H2 , HSQLDB , Derby i Berkeley DB wydają się być dobrymi kandydatami, ale wciąż nie widzę ich porównania. Doceniam twoją pomoc w porównaniu ich i pomaganiu mi zdecydować, którego użyć.

Zamierzam używać Hibernate w mojej aplikacji (chyba że poleciłbyś używanie API dostarczonego przez DBMS), ale chcę też mieć możliwość łatwej edycji bazy danych za pomocą narzędzia do przeglądania SQL (modyfikowanie schematu i zmiana danych).

Dziękuję Ci.

Hosam Aly
źródło
Nie wiedząc, co próbujesz zrobić, nie możesz odpowiedzieć na to pytanie. Proponuję uzupełnić pytanie o informacje o wielkości projektu, ile planujesz mieć tabel, ile rekordów itp.
Outlaw Programmer
3
możliwe duplikaty wbudowanych baz danych Java
Hosam Aly,
5
To irytujące, że naziści zamykają tak dobre pytania. Jasne, niektóre niejasne pytania nie są odpowiednie, ale to z pewnością jest. Gdzie „Odpowiednie” oznacza przydatne dla społeczności, a nie według niektórych legalistycznych definicji.
Tuntable

Odpowiedzi:

60

Zarówno

  • HSQLDB - używany przez OpenOffice, przetestowany i stabilny. Jest łatwy w użyciu. Jeśli chcesz edytować swoje dane db, możesz po prostu otworzyć plik i edytować instrukcje wstawiania.

lub

  • H2 - Mówi się, że jest szybszy (przez programistę, który również pierwotnie zaprojektował hsqldb)

To, którego użyjesz, zależy od Ciebie, w zależności od tego, ile wydajności i stabilności potrzebujesz.

Twórca H2 przedstawił dobrą ocenę wydajności:
http://www.h2database.com/html/performance.html

Sven Lilienthal
źródło
35

Używam Apache Derby do prawie wszystkich moich potrzeb związanych z wbudowaną bazą danych. Możesz także użyć Java DB firmy Sun opartej na Derby, ale najnowsza wersja Derby jest znacznie nowsza. Obsługuje wiele opcji obsługiwanych przez komercyjne, natywne bazy danych, ale jest znacznie mniejszy i łatwiejszy do osadzenia. Miałem kilka tabel bazy danych z ponad milionem rekordów bez żadnych problemów.

Używałem HSQLDB i Hypersonic około 3 lata temu. Ma w tym czasie poważne problemy z wydajnością i przechodzę z niego na Derby z powodu tych problemów. Derby było solidne, nawet gdy znajdowało się w inkubatorze w Apache.

Chris Dail
źródło
Derby byłoby świetne, gdyby nie fakt, że jest tak wiele błędów, a ostatnia aktualizacja miała miejsce kilka lat temu.
Hooli
2
@Hooli Nie mogę potwierdzić błędów, ale „... ostatnia aktualizacja miała miejsce kilka lat temu” jest niepoprawne. W stosunku do czasu, w którym opublikowałeś swój komentarz ( sierpień 2016 r. ): Wydano mniej niż rok wcześniej ( październik 2015 r. ), Wydano dwa miesiące później ( październik 2016 r. ) I wydano nieco ponad rok później ( październik 2017 r. - najnowsze ).
Slaw
Aktualizuję ten komentarz na wypadek, gdyby ktoś inny natknął się na ten temat podczas wyszukiwania. Najnowsze wydanie Derby miało miejsce w marcu / 2019. Oto informacje o ich witrynie: db.apache.org/derby
JavaJd
@Chris Dail Czy użyłeś derby dla milionów rekordów jako normalnej bazy danych, w pamięci lub do buforowania?
Shreyans jain
30

W jednym z moich projektów potrzebowałem użyć bazy danych wbudowanej w Javę i przeprowadziłem wiele badań, rozumiejąc zalety i wady każdej bazy danych. Napisałem bloga z listą zalet i wad popularnych wbudowanych baz danych Java (H2, HSQLDB, Derby, ObjectDB, Neo4j, OrientDB), możesz na to spojrzeć. Wybrałem H2, ponieważ uważałem, że najlepiej odpowiada moim wymaganiom. Link do bloga: http://sayrohan.blogspot.in/2012/12/choosing-light-weight-java-database.html Mam nadzieję, że to pomoże!

Rohan Karwa
źródło
14

HSQLDB to dobry kandydat (fakt, że jest używany w OpenOffice może przekonać niektórych z Was), ale dla tak małej aplikacji personalnej dlaczego nie skorzystać z obiektowej bazy danych (zamiast klasycznej relacyjnej bazy danych)?

Użyłem DB4O w jednym z moich projektów i jestem z niego bardzo zadowolony. Będąc zorientowanym obiektowo, nie potrzebujesz całej warstwy Hibernacji i możesz bezpośrednio wstawiać / aktualizować / usuwać / wyszukiwać obiekty! Co więcej, nie musisz martwić się o schemat, pracujesz bezpośrednio z obiektami, a DB4O zajmie się resztą!

Zgadzam się, że przyzwyczajenie się do tego nowego typu bazy danych może zająć trochę czasu, ale zapoznaj się z samouczkiem DB40, aby zobaczyć, jak łatwa jest praca z DB!

EDYCJA: Jak wspomniano w komentarzach, DB4O automatycznie obsługuje nowsze wersje klas. Ponadto narzędzie do przeglądania i aktualizacji bazy danych poza aplikacją dostępne jest tutaj: http://code.google.com/p/db4o-om/

Wookai
źródło
2
Dzięki. DB4O wygląda dobrze przy tak małym projekcie, ale uważam, że możliwość przeglądania i edycji danych poza aplikacją jest bardzo ważna. Czy byłoby łatwo obsługiwać nowsze wersje klas? (np. dodane / usunięte pola)
Hosam Aly
Jak powiedziałem w mojej edycji, istnieje narzędzie do przeglądania i edycji bazy danych poza aplikacją. Jak powiedział Fabian, nowsze wersje klas są automatycznie obsługiwane.
Wookai,
Dziękuję za aktualizację. Posiadanie narzędzia do przeglądania było dla mnie bardzo ważne, więc wielkie dzięki.
Hosam Aly
12

Java DB (dystrybucja Apache Derby firmy Sun) jest teraz dostępna w JDK 6!

Chciałem zrobić coś takiego jak Jason Cohen i pomyślałem, że to najłatwiejszy sposób bycia w dystrybucji JDK (która z zeszłego tygodnia jest teraz wymagana dla mojej aplikacji). A może jestem po prostu leniwy w ten sposób.

Stu Thompson
źródło
Pewnie masz rację! Wymagane jest, abyśmy działali również pod Javą 1.5, więc nie jest to dla nas opcja.
Jason Cohen,
... Chodziło mi o to, że miałeś rację co do tego, że jest to najłatwiejszy sposób, a nie co do bycia leniwym. :-P
Jason Cohen,
Java DB jest dostarczana tylko z implementacjami JDK firmy Sun / Oracle. Nie jest to standardowa część języka Java.
Basil Bourque,
7

Używamy HSQLDB w produkcji jako opcji "bez konfiguracji" dla naszej aplikacji. Pozwala ludziom na próbę bez kłopotów z konfigurowaniem prawdziwej bazy danych.

Jednak nie obsługujemy go do normalnego użytkowania. Powodów jest kilka:

  1. Spowalnia proporcjonalnie do rozmiaru danych.
  2. Trudny dostęp poza naszą aplikacją (np. W przypadku niestandardowych raportów).
  3. Transakcje / synchronizacja dysku są trudne do wykonania, więc łatwo jest stracić dane.

Przynajmniej dla (2) i (3) można to obejść, ale jest to trudne; dużo łatwiej jest np. zainstalować MySQL.

Jason Cohen
źródło
7

neo4j to:

wbudowany, dyskowy, w pełni transakcyjny silnik trwałości Java, który przechowuje dane w formie wykresów, a nie tabel

Nie miałem jeszcze okazji tego spróbować - ale wygląda to bardzo obiecująco. Zwróć uwagę, że to nie jest baza danych SQL - Twój wykres obiektu jest dla Ciebie utrwalony - więc może nie być odpowiedni dla Twojej istniejącej aplikacji.

devstopfix
źródło
5

Większość rzeczy już powiedziano, ale mogę tylko dodać, że użyłem HSQL, Derby i Berkely DB w kilku moich domowych projektach i wszystkie działały dobrze. Więc nie sądzę, żeby było to naprawdę ważne, żeby być szczerym. Warto wspomnieć, że HSQL zapisuje się jako plik tekstowy z instrukcjami SQL, co jest całkiem niezłe. Sprawia, że ​​jest to naprawdę łatwe, gdy tworzysz oprogramowanie, aby szybko wykonać testy i skonfigurować dane. W razie potrzeby może też szybko edytować. Chyba możesz łatwo przenieść to wszystko do dowolnej bazy danych, jeśli kiedykolwiek zajdzie potrzeba zmiany :)

willcodejavaforfood
źródło
5

HSQLDB może powodować problemy w przypadku dużych aplikacji, ponieważ nie jest tak stabilny.

Najlepsze, jakie słyszałem (ale nie z pierwszej ręki), to berkleyDB. Ale jeśli go nie otworzysz, korzystanie z niego będzie kosztować rękę i nogę ze względu na licencję ... zobacz http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html dla szczegółów.

ps. berkleyDB nie jest relacyjną bazą danych na wypadek, gdybyś tego nie wiedział.

Chii
źródło
Och, nie wiedziałem, że Berkeley nie jest relacyjną bazą danych! Wielkie dzięki!
Hosam Aly
nie oznacza, że ​​to nie jest dobre. ale podejrzewam, że jest prawdopodobnie zbyt dobry do twojego użytku, biorąc pod uwagę, że jest to coś osobistego. również spójrz na sqlite. Myślę, że ma powiązania Java, ale nie mogę go znaleźć w atm.
Chii
4

Jestem wielkim fanem DB4O zarówno dla .Net, jak i Java .

Wydajność stała się znacznie lepsza od czasu wczesnych wydań. Model licencjonowania też nie jest zły. Szczególnie podoba mi się dostępne opcje wyszukiwania obiektów. Zapytanie na podstawie przykładu jest bardzo potężne i łatwe do przyzwyczajenia.

Kilhoffer
źródło
4

Jakich kryteriów użyjesz do ich oceny? Jeśli jeszcze nie wiesz, nie musisz teraz podejmować decyzji. Postaraj się, aby Twoja aplikacja była jak najbardziej niezależna od implementacji bazy danych - zapewniając odpowiednie opakowania, obiekty dostępu do danych itp. I podejmij tę decyzję, gdy masz wszystkie fakty i musisz zdecydować.

Jeśli używasz relacyjnych baz danych i SQL, powyższe nie powinno być zbyt trudne (używanie JDBC itp.). Upewnij się, że masz wiele otaczających testów, aby przełączając się między bazami danych, można było stwierdzić, że funkcjonalność aplikacji pozostaje taka sama.

Już jakiś czas temu napotkałem ten sam problem. Nie wiedziałem, do której bazy danych się wybrać, więc moje pierwsze rozwiązanie korzystało z Derby (lub HSQLDB?), A później mogłem przełączyć się na HSQLDB (lub Derby? Nie pamiętam, które rozwiązanie zadziałało) po ustaleniu, gdzie Miałem problemy (związane z wydajnością) i które rozwiązanie naprawdę by mi pasowało.

Brian Agnew
źródło
3

Użyłem Derby i naprawdę nienawidzę jego funkcji konwersji typu danych, zwłaszcza funkcji daty / czasu. (Typ liczby) <--> Konwersja Varchar to ból.

Jeśli więc planujesz używać konwersji typów danych w swoich instrukcjach DB, rozważ użycie innej wbudowanej bazy danych, uczę się tego za późno.

Najnowsze konwersje typów danych w wersji Derby

Telcontar
źródło
3

Osobiście wolę HSQLDB, ale głównie dlatego, że był to pierwszy, którego spróbowałem.

Mówi się, że H2 jest szybszy i zapewnia ładniejszą nakładkę GUI (która jest ogólna i współpracuje z każdym sterownikiem JDBC).

Przynajmniej HSQLDB, H2 i Derby zapewniają tryby serwera, które są świetne do programowania, ponieważ możesz uzyskać dostęp do bazy danych za pomocą aplikacji i jakiegoś narzędzia w tym samym czasie (co zwykle nie pozwala na tryb wbudowany).

Joachim Sauer
źródło
3

Wydaje mi się, że trochę się spóźniłem (bardzo późno ;-)) z tym postem, ale chciałbym dodać Perst, osadzoną bazę danych o otwartym kodzie źródłowym dla Javy i .NET. do rozważenia. Perst to wbudowana baza danych typu open source / z podwójną licencją dla języka Java. Dystrybucja jest kompatybilna z platformą Google Android, a także zawiera Perst Lite for Java ME. Stworzyliśmy nawet test porównawczy Androida i opracowaliśmy raport na ten temat ... możesz zajrzeć tutaj: http://www.mcobject.com/index.cfm?fuseaction=download&pageid=581§ionid=133

Wszystkiego najlepszego, Chris


źródło
3

Jeśli mam rację, H2 pochodzi od tych samych gości, którzy napisali HSQLDB. O wiele lepiej, jeśli ufasz testom porównawczym ich witryny. Istnieje również pogląd, że społeczność Sun zbyt szybko wskoczyła do Derby.

smartnut007
źródło
2
O co chodzi w przedwczesnych derbach w DerbyDB? Dojrzałość?
simgineer,
2

Zdaję sobie sprawę, że wspomniałeś o przeglądaniu SQL, ale wszystko inne w twoim pytaniu sprawia, że ​​chcę zasugerować, abyś również rozważył DB4O , który jest świetnym, prostym obiektowym DB .

Fabian Steeg
źródło
Dzięki. DB4O wygląda dobrze przy tak małym projekcie, ale uważam, że możliwość przeglądania i edycji danych poza aplikacją jest bardzo ważna. Czy byłoby łatwo obsługiwać nowsze wersje klas? (np. dodane / usunięte pola)
Hosam Aly
Tak, automatycznie obsługuje niektóre refaktoryzacje, więcej na ten temat można znaleźć tutaj: ibm.com/developerworks/java/library/j-db4o3.html
Fabian Steeg