Sprievodca po MapDB

1. Úvod

V tomto článku sa pozrieme na Knižnica MapDB - zabudovaný databázový stroj prístupný cez API podobné zbierke.

Začneme preskúmaním základných tried DB a DBMaker ktoré pomáhajú konfigurovať, otvárať a spravovať naše databázy. Potom sa ponoríme do niekoľkých príkladov dátových štruktúr MapDB, ktoré ukladajú a načítajú údaje.

Na záver sa pozrieme na niektoré režimy v pamäti pred porovnaním MapDB s tradičnými databázami a zbierkami Java.

2. Ukladanie údajov v MapDB

Najprv si predstavíme dve triedy, ktoré budeme v tomto výučbe neustále používať - DB a DBMaker. The DB trieda predstavuje otvorenú databázu. Jeho metódy vyvolávajú akcie na vytváranie a zatváranie zbierok úložiska na spracovanie záznamov v databáze, ako aj na spracovanie transakčných udalostí.

DBMaker spracováva konfiguráciu, vytváranie a otváranie databázy. V rámci konfigurácie sa môžeme rozhodnúť hostiť našu databázu buď v pamäti, alebo v našom súborovom systéme.

2.1. Jednoduchý HashMap Príklad

Aby sme pochopili, ako to funguje, urobme si inštanciu novej databázy v pamäti.

Najskôr vytvoríme novú pamäťovú databázu pomocou DBMaker trieda:

DB db = DBMaker.memoryDB (). Make ();

Raz náš DB objekt je funkčný, môžeme ho použiť na vytvorenie súboru HTreeMap pracovať s našimi databázovými záznamami:

Reťazec welcomeMessageKey = "Uvítacia správa"; Reťazec welcomeMessageString = "Dobrý deň, Baeldung!"; HTreeMap myMap = db.hashMap ("myMap"). CreateOrOpen (); myMap.put (welcomeMessageKey, welcomeMessageString);

HTreeMap je MapDB HashMap implementácia. Takže teraz, keď máme v našej databáze údaje, môžeme ich načítať pomocou dostať metóda:

Reťazec welcomeMessageFromDB = (Reťazec) myMap.get (welcomeMessageKey); assertEquals (welcomeMessageString, welcomeMessageFromDB);

Nakoniec, keď sme s databázou hotoví, mali by sme ju zavrieť, aby sme sa vyhli ďalším mutáciám:

db.close ();

Aby sme mohli ukladať naše údaje do súboru, a nie do pamäte, musíme zmeniť iba ten náš DB objekt je inštancovaný:

DB db = DBMaker.fileDB ("file.db"). Make ();

Náš príklad vyššie nepoužíva žiadne parametre typu. Vo výsledku sa snažíme odovzdávať výsledky do práce s konkrétnymi typmi. V našom ďalšom príklade si predstavíme Serializátory aby sa vylúčila potreba liatia.

2.2. Zbierky

MapDB obsahuje rôzne typy zbierok. Na ukážku pridajme a načítame niektoré údaje z našej databázy pomocou a NavigableSet, ktorý funguje, ako by ste od Javy očakávali Nastaviť:

Začnime jednoduchým príkladom našich DB objekt:

DB db = DBMaker.memoryDB (). Make ();

Ďalej si vytvorme našu NavigableSet:

NavigableSet set = db .treeSet ("mySet") .serializer (Serializer.STRING) .createOrOpen ();

Tu je serializátor zaisťuje, že vstupné údaje z našej databázy sú serializované a deserializované pomocou String predmety.

Ďalej pridajme niektoré údaje:

set.add ("Baeldung"); set.add ("je úžasné");

Teraz skontrolujeme, či boli naše dve odlišné hodnoty pridané do databázy správne:

assertEquals (2, set.size ());

Nakoniec, keďže ide o množinu, pridajme duplicitný reťazec a overme, či naša databáza obsahuje iba dve hodnoty:

set.add ("Baeldung"); assertEquals (2, set.size ());

2.3. Transakcie

Rovnako ako tradičné databázy, aj DB trieda poskytuje metódy pre spáchať a rollback údaje, ktoré pridávame do našej databázy.

Aby sme mohli túto funkciu povoliť, musíme inicializovať našu DB s transactionEnable metóda:

DB db = DBMaker.memoryDB (). TransactionEnable (). Make ();

Ďalej vytvorme jednoduchú množinu, pridajme nejaké údaje a odovzdajme ich do databázy:

NavigableSet set = db .treeSet ("mySet") .serializer (Serializer.STRING) .createOrOpen (); set.add ("Jeden"); set.add ("Dva"); db.commit (); assertEquals (2, set.size ());

Teraz pridajme do našej databázy tretí nezáväzný reťazec:

set.add ("Tri"); assertEquals (3, set.size ());

Ak nie sme spokojní s našimi údajmi, môžeme ich vrátiť pomocou Vrátenie zmien spoločnosti DB metóda:

db.rollback (); assertEquals (2, set.size ());

2.4. Serializátory

MapDB ponúka širokú škálu serializátorov, ktoré spracúvajú údaje v rámci zbierky. Najdôležitejším parametrom stavby je názov, ktorý identifikuje jednotlivú kolekciu v rámci DB objekt:

HTreeMap mapa = db.hashMap ("názov_identifikácie") .keySerializer (Serializer.STRING) .valSSerializer (Serializer.LONG) .create ();

Aj keď je odporúčaná serializácia, je voliteľná a dá sa preskočiť. Je však potrebné poznamenať, že to povedie k pomalšiemu procesu generickej serializácie.

3. HTreeMap

MapDB HTreeMap poskytuje HashMap a HashSet zbierky pre prácu s našou databázou. HTreeMap je segmentovaný hash strom a nepoužíva hash tabuľku pevnej veľkosti. Namiesto toho používa automaticky sa rozširujúci indexový strom a pri raste tabuľky neopravuje všetky svoje údaje. Na začiatok HTreeMap je bezpečný pre vlákna a podporuje paralelné zápisy pomocou viacerých segmentov.

Na začiatok si ukážeme jednoduchú inštanciu HashMap ktorý používa String pre kľúče aj hodnoty:

DB db = DBMaker.memoryDB (). Make (); HTreeMap hTreeMap = db .hashMap ("myTreeMap") .keySerializer (Serializer.STRING) .valSSerializer (Serializer.STRING) .create ();

Vyššie sme definovali osobitne serializátory pre kľúč a hodnotu. Teraz, keď naše HashMap je vytvorený, pridajme údaje pomocou dať metóda:

hTreeMap.put ("kľúč1", "hodnota1"); hTreeMap.put ("kľúč2", "hodnota2"); assertEquals (2, hTreeMap.size ());

Ako HashMap pracuje na HashCode objektu metóda, pridanie údajov pomocou rovnakého kľúča spôsobí prepísanie hodnoty:

hTreeMap.put ("kľúč1", "hodnota3"); assertEquals (2, hTreeMap.size ()); assertEquals ("hodnota3", hTreeMap.get ("kľúč1"));

4. SortedTableMap

MapDB SortedTableMap ukladá kľúče do tabuľky pevnej veľkosti a na vyhľadávanie používa binárne vyhľadávanie. Stojí za zmienku, že po príprave je mapa iba na čítanie.

Poďme si prejsť procesom vytvárania a dopytovania a SortedTableMap. Začneme vytvorením zväzku mapovaného do pamäte na uchovanie údajov, ako aj umývadla na pridanie údajov. Pri prvom vyvolaní nášho zväzku nastavíme príznak iba na čítanie na nepravdivé, čím zabezpečíme, že do zväzku môžeme napísať:

Reťazec VOLUME_LOCATION = "sortTableMapVol.db"; Volume vol = MappedFileVol.FACTORY.makeVolume (VOLUME_LOCATION, false); SortedTableMap.Sink sink = SortedTableMap.create (vol, Serializer.INTEGER, Serializer.STRING) .createFromSink ();

Ďalej doplníme naše údaje a zavoláme na vytvoriť metóda na umývadle na vytvorenie našej mapy:

for (int i = 0; i <100; i ++) {sink.put (i, "Hodnota" + Integer.toString (i)); } sink.create ();

Teraz, keď naša mapa existuje, môžeme definovať objem iba na čítanie a otvoriť našu mapu pomocou SortedTableMap je otvorená metóda:

Volume openVol = MappedFileVol.FACTORY.makeVolume (VOLUME_LOCATION, true); SortedTableMap SortTableMap = SortedTableMap .open (openVol, Serializer.INTEGER, Serializer.STRING); assertEquals (100, triedenéTableMap.size ());

4.1. Binárne vyhľadávanie

Než pôjdeme ďalej, pochopme, ako SortedTableMap využíva binárne vyhľadávanie podrobnejšie.

SortedTableMap rozdelí úložisko na stránky, pričom každá stránka obsahuje niekoľko uzlov zložených z kľúčov a hodnôt. V týchto uzloch sú páry kľúč - hodnota, ktoré definujeme v našom kóde Java.

SortedTableMap vykoná tri binárne vyhľadávania na získanie správnej hodnoty:

  1. Kľúče pre každú stránku sú uložené v hromadách v poli. The SortedTableMap vykoná binárne vyhľadávanie, aby našiel správnu stránku.
  2. Ďalej nastáva dekompresia pre každý kľúč v uzle. Binárne vyhľadávanie vytvorí správny uzol podľa kľúčov.
  3. Nakoniec SortedTableMap prehľadá kľúče v uzle a nájde správnu hodnotu.

5. Režim v pamäti

MapDB ponúka tri typy úložiska v pamäti. Poďme sa rýchlo pozrieť na každý režim, porozumieť jeho fungovaniu a preskúmať jeho výhody.

5.1. Na hromade

Režim haldy ukladá objekty do jednoduchej zbierky Java Mapa. To nepoužíva serializáciu a pre malé súbory údajov môže byť veľmi rýchly.

Pretože sa však údaje ukladajú na halde, množina údajov sa spravuje prostredníctvom zberu odpadu (GC). Trvanie GC stúpa s veľkosťou datasetu, čo má za následok pokles výkonu.

Pozrime sa na príklad špecifikujúci režim on-heap:

DB db = DBMaker.heapDB (). Make ();

5.2. Bajt []

Druhý typ úložiska je založený na bajtových poliach. V tomto režime dáta sú serializované a ukladané do polí do veľkosti 1 MB. Aj keď je táto metóda technicky na halde, je efektívnejšia na zber odpadu.

Toto je predvolene odporúčané a bolo použité v našom ‘Ahoj Baeldung ' príklad:

DB db = DBMaker.memoryDB (). Make ();

5.3. DirectByteBuffer

Konečný obchod je založený na DirectByteBuffer. Priama pamäť zavedená v prostredí Java 1.4 umožňuje prenos údajov priamo do natívnej pamäte, a nie do haldy Java. Vo výsledku sa údaje uložia úplne mimo haldy.

Obchod tohto typu môžeme vyvolať pomocou:

DB db = DBMaker.memoryDirectDB (). Make ();

6. Prečo MapDB?

Prečo teda používať MapDB?

6.1. MapDB vs tradičná databáza

MapDB ponúka veľké množstvo databázových funkcií nakonfigurovaných iba na niekoľko riadkov kódu Java. Keď používame MapDB, môžeme sa vyhnúť často časovo náročnému nastavovaniu rôznych služieb a pripojení potrebných na to, aby náš program fungoval.

Okrem toho nám MapDB umožňuje prístup ku zložitosti databázy so znalosťou zbierky Java. S MapDB nepotrebujeme SQL a k záznamom môžeme pristupovať jednoducho dostať volania metód.

6.2. MapDB vs Jednoduché zbierky Java

Zbierky Java nezastavia údaje našej aplikácie, akonáhle sa zastaví. MapDB ponúka jednoduchú, flexibilnú a pripojiteľnú službu, ktorá nám umožňuje rýchlo a ľahko uchovať údaje v našej aplikácii pri zachovaní užitočnosti typov zbierok Java.

7. Záver

V tomto článku sme sa hlboko ponorili do zabudovaného databázového stroja a rámca zbierky MapDB.

Začali sme pohľadom na základné triedy DB a DBMaker konfigurovať, otvárať a spravovať našu databázu. Potom sme si prešli niekoľko príkladov dátových štruktúr, ktoré MapDB ponúka na prácu s našimi záznamami. Nakoniec sme sa pozreli na výhody MapDB oproti tradičnej databáze alebo zbierke Java.

Vzorový kód je ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found