Vodič za MapDB

1. Uvod

U ovom ćemo članku pogledati MapDB knjižnica - ugrađeni mehanizam baze podataka kojem se pristupa putem API-ja sličnog zbirci.

Započinjemo s istraživanjem osnovnih klasa DB i DBMaker koji pomažu u konfiguriranju, otvaranju i upravljanju našim bazama podataka. Zatim ćemo zaroniti u neke primjere MapDB struktura podataka koje pohranjuju i dohvaćaju podatke.

Na kraju ćemo pogledati neke načine rada u memoriji prije usporedbe MapDB-a s tradicionalnim bazama podataka i Java kolekcijama.

2. Pohranjivanje podataka u MapDB

Prvo, predstavimo dva razreda koja ćemo neprestano koristiti tijekom ovog vodiča - DB i DBMaker. The DB klasa predstavlja otvorenu bazu podataka. Njegove metode pozivaju na radnje za stvaranje i zatvaranje zbirki pohrane za obradu zapisa baze podataka, kao i za obradu transakcijskih događaja.

DBMaker obrađuje konfiguraciju, izradu i otvaranje baze podataka. Kao dio konfiguracije, možemo odabrati hostiranje naše baze podataka bilo u memoriji ili u našem datotečnom sustavu.

2.1. Jednostavan HashMap Primjer

Da bismo razumjeli kako ovo funkcionira, napravimo instanciju nove baze podataka u memoriji.

Prvo stvorimo novu bazu podataka u memoriji pomoću DBMaker razred:

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

Jednom naša DB objekt je pokrenut i možemo ga koristiti za izgradnju HTreeMap za rad s našim zapisima baze podataka:

String welcomeMessageKey = "Poruka dobrodošlice"; String welcomeMessageString = "Pozdrav Baeldung!"; HTreeMap myMap = db.hashMap ("myMap"). CreateOrOpen (); myMap.put (welcomeMessageKey, welcomeMessageString);

HTreeMap je MapDB HashMap provedba. Dakle, sada kada imamo podatke u našoj bazi podataka, možemo ih dobiti pomoću dobiti metoda:

String welcomeMessageFromDB = (Niz) myMap.get (welcomeMessageKey); assertEquals (welcomeMessageString, welcomeMessageFromDB);

Napokon, sada kada smo završili s bazom podataka, trebali bismo je zatvoriti kako bismo izbjegli daljnju mutaciju:

db.close ();

Da bismo svoje podatke pohranili u datoteku, a ne u memoriju, sve što trebamo učiniti je promijeniti način na koji naš DB objekt je instanciran:

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

Naš gornji primjer ne koristi parametre tipa. Kao rezultat, zaglibili smo u lijevanju naših rezultata za rad s određenim vrstama. U sljedećem ćemo primjeru predstaviti Serijalizatori kako bi se eliminirala potreba za lijevanjem.

2.2. Zbirke

MapDB uključuje različite vrste zbirki. Da bismo demonstrirali, dodajmo i dohvatimo neke podatke iz naše baze podataka pomoću a NavigableSet, koji radi kao što biste mogli očekivati ​​od Jave Postavi:

Počnimo s jednostavnom instancijom našeg DB objekt:

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

Dalje, kreirajmo naše NavigableSet:

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

Evo, serializator osigurava da su ulazni podaci iz naše baze podataka serializirani i deserijalizirani pomoću Niz predmeta.

Dalje, dodajmo neke podatke:

set.add ("Baeldung"); set.add ("super je");

Sada provjerimo jesu li naše dvije različite vrijednosti ispravno dodane u bazu podataka:

assertEquals (2, set.size ());

Konačno, budući da je ovo skup, dodajmo duplicirani niz i provjerimo sadrži li naša baza podataka samo dvije vrijednosti:

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

2.3. Transakcije

Slično kao i tradicionalne baze podataka, DB razred pruža metode za počiniti i vraćanje podaci koje dodajemo u našu bazu podataka.

Da bismo omogućili ovu funkcionalnost, moramo inicijalizirati naš DB s transakcijaOmogućeno metoda:

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

Dalje, kreirajmo jednostavan skup, dodajte neke podatke i predajte ih u bazu podataka:

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

Sada, dodajmo treći, neobavešteni niz u našu bazu podataka:

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

Ako nismo zadovoljni svojim podacima, možemo vratiti podatke pomoću Vraćanje DB-a metoda:

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

2.4. Serijalizatori

MapDB nudi veliku raznolikost serializatora koji obrađuju podatke unutar zbirke. Najvažniji parametar konstrukcije je naziv koji identificira pojedinačnu zbirku unutar DB objekt:

HTreeMap map = db.hashMap ("indentification_name") .keySerializer (Serializer.STRING) .valueSerializer (Serializer.LONG) .create ();

Iako se serializacija preporučuje, ona nije obavezna i može se preskočiti. Međutim, vrijedno je napomenuti da će to dovesti do sporijeg generičkog postupka serializacije.

3. HTreeMap

MapDB-ovi HTreeMap pruža HashMap i HashSet zbirke za rad s našom bazom podataka. HTreeMap je segmentirano hash stablo i ne koristi hash tablicu fiksne veličine. Umjesto toga koristi stablo indeksa koje se automatski proširuje i ne preispituje sve svoje podatke kako tablica raste. Za kraj, HTreeMap je siguran za nit i podržava paralelno upisivanje pomoću više segmenata.

Za početak, napravimo instancu jednostavnog HashMap koja koristi Niz i za ključeve i za vrijednosti:

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

Iznad smo definirali odvojeno serializatori za ključ i vrijednost. Sad to naše HashMap je kreirano, dodajmo podatke pomoću staviti metoda:

hTreeMap.put ("key1", "value1"); hTreeMap.put ("key2", "value2"); assertEquals (2, hTreeMap.size ());

Kao HashMap radi na an HashCode objekta metodom, dodavanjem podataka pomoću istog ključa dolazi do prepisivanja vrijednosti:

hTreeMap.put ("key1", "value3"); assertEquals (2, hTreeMap.size ()); assertEquals ("value3", hTreeMap.get ("key1"));

4. SortedTableMap

MapDB-ovi SortedTableMap sprema ključeve u tablicu fiksne veličine i koristi binarno pretraživanje za pronalaženje. Vrijedno je napomenuti da je karta jednom pripremljena samo za čitanje.

Krenimo kroz proces stvaranja i postavljanja upita za SortedTableMap. Započet ćemo s stvaranjem memorirano preslikane jedinice za čuvanje podataka, kao i sudopera za dodavanje podataka. Pri prvom pozivu našeg volumena postavićemo oznaku samo za čitanje lažno, osiguravajući da možemo pisati u svezak:

Niz VOLUME_LOCATION = "sortedTableMapVol.db"; Volumen vol = MappedFileVol.FACTORY.makeVolume (VOLUME_LOCATION, false); SortedTableMap.Sink sink = SortedTableMap.create (vol, Serializer.INTEGER, Serializer.STRING) .createFromSink ();

Zatim ćemo dodati svoje podatke i nazvati stvoriti metoda na sudoperu za izradu naše karte:

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

Sada kada naša karta postoji, možemo definirati volumen samo za čitanje i otvoriti našu kartu pomoću SortedTableMap je otvoren metoda:

Volumen openVol = MappedFileVol.FACTORY.makeVolume (VOLUME_LOCATION, true); SortedTableMap sortedTableMap = SortedTableMap .open (openVol, Serializer.INTEGER, Serializer.STRING); assertEquals (100, sortedTableMap.size ());

4.1. Binarno pretraživanje

Prije nego krenemo dalje, shvatimo kako SortedTableMap detaljnije koristi binarno pretraživanje.

SortedTableMap dijeli pohranu na stranice, a svaka stranica sadrži nekoliko čvorova koji se sastoje od ključeva i vrijednosti. Unutar ovih čvorova nalaze se parovi ključ / vrijednost koje definiramo u našem Java kodu.

SortedTableMap izvodi tri binarna pretraživanja kako bi dohvatio točnu vrijednost:

  1. Ključevi svake stranice pohranjuju se u hrpi u nizu. The SortedTableMap vrši binarno pretraživanje kako bi pronašao ispravnu stranicu.
  2. Dalje, dekompresija se događa za svaki ključ u čvoru. Binarno pretraživanje uspostavlja točan čvor, prema ključevima.
  3. Napokon, SortedTableMap pretražuje tipke unutar čvora kako bi pronašao ispravnu vrijednost.

5. Način rada u memoriji

MapDB nudi tri vrste pohrane u memoriji. Kratko ćemo pogledati svaki način rada, shvatiti kako on funkcionira i proučiti njegove prednosti.

5.1. Na hrpi

Način rada na hrpi pohranjuje predmete u jednostavnu Java Zbirku Karta. To ne koristi serializaciju i može biti vrlo brz za male skupove podataka.

Međutim, budući da se podaci pohranjuju na hrpi, skupom podataka upravlja prikupljanje smeća (GC). Trajanje GC raste s veličinom skupa podataka, što rezultira padom performansi.

Pogledajmo primjer koji specificira način rada na heap:

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

5.2. Bajt[]

Druga vrsta spremišta temelji se na bajtovskim nizovima. U ovom načinu rada, podaci su serializirani i pohranjeni u nizove veličine do 1 MB. Iako je tehnički nagomilana, ova je metoda učinkovitija za odvoz smeća.

Ovo se preporučuje prema zadanim postavkama i korišteno je u našem "Pozdrav Baeldung ' primjer:

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

5.3. DirectByteBuffer

Konačna trgovina temelji se na DirectByteBuffer. Izravna memorija, uvedena u Javi 1.4, omogućuje prosljeđivanje podataka izravno u matičnu memoriju, a ne u Java gomilu. Kao rezultat, podaci će biti pohranjeni potpuno izvan gomile.

Na trgovinu ove vrste možemo se pozvati sa:

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

6. Zašto MapDB?

Pa, zašto koristiti MapDB?

6.1. MapDB u odnosu na tradicionalnu bazu podataka

MapDB nudi velik niz funkcionalnosti baze podataka konfiguriranih sa samo nekoliko redaka Java koda. Kada upotrijebimo MapDB, možemo izbjeći često zahtjevno postavljanje raznih usluga i veza potrebnih za rad našeg programa.

Osim toga, MapDB nam omogućuje pristup složenosti baze podataka s poznavanjem Java zbirke. Uz MapDB ne treba nam SQL, a zapisima možemo pristupiti jednostavno dobiti pozivi metode.

6.2. MapDB vs Jednostavne Java kolekcije

Java zbirke neće zadržati podatke naše aplikacije nakon što prestane s izvršavanjem. MapDB nudi jednostavnu, fleksibilnu uslugu koja se može priključiti koja nam omogućuje brzo i jednostavno zadržavanje podataka u našoj aplikaciji uz održavanje korisnosti tipova Java kolekcije.

7. Zaključak

U ovom smo članku duboko zarobili MapDB-ov ugrađeni mehanizam baze podataka i okvir za prikupljanje.

Započeli smo gledajući osnovne satove DB i DBMaker za konfiguriranje, otvaranje i upravljanje našom bazom podataka. Zatim smo prošetali kroz neke primjere struktura podataka koje MapDB nudi za rad s našim zapisima. Na kraju smo pogledali prednosti MapDB-a u odnosu na tradicionalnu bazu podataka ili Java Collection.

Kao i uvijek, primjer koda dostupan je na GitHub-u.