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:
- Ključevi svake stranice pohranjuju se u hrpi u nizu. The SortedTableMap vrši binarno pretraživanje kako bi pronašao ispravnu stranicu.
- Dalje, dekompresija se događa za svaki ključ u čvoru. Binarno pretraživanje uspostavlja točan čvor, prema ključevima.
- 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.