Guide til MapDB

1. Introduktion

I denne artikel vil vi se på MapDB-bibliotek - en indbygget databasemotor, der er adgang til via en samlingslignende API.

Vi starter med at udforske kerneklasser DB og DBMaker der hjælper med at konfigurere, åbne og administrere vores databaser. Derefter dykker vi ned i nogle eksempler på MapDB-datastrukturer, der gemmer og henter data.

Endelig skal vi se på nogle af hukommelsestilstandene, før vi sammenligner MapDB med traditionelle databaser og Java-samlinger.

2. Lagring af data i MapDB

Lad os først introducere de to klasser, som vi konstant bruger i hele denne tutorial - DB og DBMaker. Det DB klasse repræsenterer en åben database. Dens metoder påkalder handlinger til oprettelse og lukning af lagersamlinger til håndtering af databaseposter samt håndtering af transaktionshændelser.

DBMaker håndterer databasekonfiguration, oprettelse og åbning. Som en del af konfigurationen kan vi vælge at være vært for vores database enten i hukommelsen eller i vores filsystem.

2.1. En enkel HashMap Eksempel

Lad os starte en ny database i hukommelsen for at forstå, hvordan dette fungerer.

Lad os først oprette en ny database i hukommelsen ved hjælp af DBMaker klasse:

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

En gang vores DB objektet er i gang, kan vi bruge det til at opbygge et HTreeMap at arbejde med vores databaseposter:

String welcomeMessageKey = "Velkomstmeddelelse"; String welcomeMessageString = "Hej Baeldung!"; HTreeMap myMap = db.hashMap ("myMap"). CreateOrOpen (); myMap.put (welcomeMessageKey, welcomeMessageString);

HTreeMap er MapDB'er HashMap implementering. Så nu hvor vi har data i vores database, kan vi hente dem ved hjælp af metode:

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

Endelig, nu når vi er færdige med databasen, skal vi lukke den for at undgå yderligere mutationer:

db.close ();

For at gemme vores data i en fil i stedet for i hukommelsen er alt, hvad vi skal gøre, at ændre den måde, vores DB objektet instantieres:

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

Vores eksempel ovenfor bruger ingen typeparametre. Som et resultat sidder vi fast med at kaste vores resultater til at arbejde med bestemte typer. I vores næste eksempel introducerer vi Serializers for at eliminere behovet for støbning.

2.2. Samlinger

MapDB inkluderer forskellige samlingstyper. Lad os tilføje og hente nogle data fra vores database for at demonstrere ved hjælp af en NavigableSet, som fungerer som du kunne forvente af en Java Sæt:

Lad os starte med en simpel instantiering af vores DB objekt:

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

Lad os derefter oprette vores NavigableSet:

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

Her, den serializer sikrer, at inputdataene fra vores database serialiseres og deserialiseres ved hjælp af Snor genstande.

Lad os derefter tilføje nogle data:

set.add ("Baeldung"); set.add ("er fantastisk");

Lad os nu kontrollere, at vores to forskellige værdier er blevet tilføjet til databasen korrekt:

assertEquals (2, set.size ());

Endelig, da dette er et sæt, lad os tilføje en duplikatstreng og kontrollere, at vores database stadig kun indeholder to værdier:

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

2.3. Transaktioner

Meget som traditionelle databaser, er DB klasse giver metoder til begå og tilbageførsel de data, vi tilføjer til vores database.

For at aktivere denne funktionalitet skal vi initialisere vores DB med transaktionEnable metode:

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

Lad os derefter oprette et simpelt sæt, tilføje nogle data og forpligte dem til databasen:

NavigableSet set = db .treeSet ("mySet") .serializer (Serializer.STRING) .createOrOpen (); set.add ("One"); set.add ("To"); db.forpligtelse (); assertEquals (2, set.size ());

Lad os nu tilføje en tredje, ikke-forpligtet streng til vores database:

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

Hvis vi ikke er tilfredse med vores data, kan vi tilbageføre dataene ved hjælp af DB's tilbagevenden metode:

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

2.4. Serializers

MapDB tilbyder et stort udvalg af serialiseringer, der håndterer dataene i samlingen. Den vigtigste konstruktionsparameter er navnet, der identificerer den enkelte samling i DB objekt:

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

Mens serialisering anbefales, er den valgfri og kan springes over. Det er dog værd at bemærke, at dette vil føre til en langsommere generisk serialiseringsproces.

3. HTreeMap

MapDB'er HTreeMap giver HashMap og HashSet samlinger til at arbejde med vores database. HTreeMap er et segmenteret hash-træ og bruger ikke en hash-tabel i fast størrelse. I stedet bruger det et automatisk ekspanderende indekstræ og genvasker ikke alle dets data, når tabellen vokser. For at afslutte det, HTreeMap er trådsikker og understøtter parallelle skrivninger ved hjælp af flere segmenter.

Lad os begynde med at starte et simpelt HashMap der bruger Snor for både nøgler og værdier:

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

Ovenfor har vi defineret separat serialisatorer for nøglen og værdien. Nu hvor vores HashMap er oprettet, lad os tilføje data ved hjælp af sætte metode:

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

Som HashMap arbejder på en Objektets hashCode metode tilføjer data ved hjælp af den samme nøgle, at værdien overskrives:

hTreeMap.put ("key1", "value3"); assertEquals (2, hTreeMap.size ()); assertEquals ("værdi3", hTreeMap.get ("nøgle1"));

4. SortedTableMap

MapDB'er SortedTableMap gemmer nøgler i en tabel med fast størrelse og bruger binær søgning til hentning. Det er værd at bemærke, at når kortet er klar, er det skrivebeskyttet.

Lad os gennemgå processen med at oprette og forespørge om en SortedTableMap. Vi starter med at oprette en hukommelseskortet lydstyrke til at holde dataene samt en vask for at tilføje data. Ved den første påkaldelse af vores bind sætter vi det skrivebeskyttede flag til falsk, så vi kan skrive til lydstyrken:

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

Derefter tilføjer vi vores data og kalder skab metode på vasken for at oprette vores kort:

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

Nu hvor vores kort eksisterer, kan vi definere en skrivebeskyttet volumen og åbne vores kort ved hjælp af SortedTableMap er åben metode:

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

4.1. Binær søgning

Lad os forstå, hvordan vi, inden vi går videre SortedTableMap bruger binær søgning mere detaljeret.

SortedTableMap opdeler lagringen i sider, hvor hver side indeholder flere noder, der består af nøgler og værdier. Inden for disse noder er de nøgleværdipar, som vi definerer i vores Java-kode.

SortedTableMap udfører tre binære søgninger for at hente den korrekte værdi:

  1. Nøgler til hver side gemmes på bunke i en matrix. Det SortedTableMap udfører en binær søgning for at finde den rigtige side.
  2. Dernæst opstår dekompression for hver nøgle i noden. En binær søgning etablerer den korrekte node ifølge nøglerne.
  3. Endelig blev SortedTableMap søger over nøglerne i noden for at finde den korrekte værdi.

5. In-Memory Mode

MapDB tilbyder tre typer lagerhukommelse. Lad os se hurtigt på hver tilstand, forstå hvordan den fungerer og undersøge fordelene ved den.

5.1. On-Heap

On-beap-tilstand gemmer objekter i en simpel Java-samling Kort. Det bruger ikke serialisering og kan være meget hurtig til små datasæt.

Da data imidlertid er gemt på bunken, styres datasættet af skraldindsamling (GC). Varigheden af ​​GC stiger med datasættets størrelse, hvilket resulterer i præstationsfald.

Lad os se et eksempel, der angiver on-heap-tilstand:

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

5.2. Byte []

Den anden butiktype er baseret på byte-arrays. I denne tilstand data serialiseres og gemmes i arrays op til 1 MB i størrelse. Mens den er teknisk på bunke, er denne metode mere effektiv til affaldsindsamling.

Dette anbefales som standard og blev brugt i vores 'Hej Baeldung ' eksempel:

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

5.3. DirectByteBuffer

Den endelige butik er baseret på DirectByteBuffer. Direkte hukommelse, introduceret i Java 1.4, tillader overførsel af data direkte til den indbyggede hukommelse snarere end Java-bunke. Som et resultat lagres dataene helt bunke.

Vi kan påkalde en butik af denne type med:

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

6. Hvorfor MapDB?

Så hvorfor bruge MapDB?

6.1. MapDB vs traditionel database

MapDB tilbyder et stort udvalg af databasefunktionalitet konfigureret med blot et par linjer Java-kode. Når vi ansætter MapDB, kan vi undgå den ofte tidskrævende opsætning af forskellige tjenester og forbindelser, der er nødvendige for at få vores program til at fungere.

Ud over dette giver MapDB os adgang til kompleksiteten i en database med fortroligheden af ​​en Java-samling. Med MapDB har vi ikke brug for SQL, og vi kan få adgang til poster med enkle metodeopkald.

6.2. MapDB vs Simple Java Collections

Java-samlinger fortsætter ikke dataene i vores applikation, når den stopper med at blive udført. MapDB tilbyder en enkel, fleksibel, tilslutbar service, der giver os mulighed for hurtigt og nemt at vedligeholde dataene i vores applikation, samtidig med at vi opretholder anvendelsen af ​​Java-samlingstyper.

7. Konklusion

I denne artikel har vi taget et dybt dyk i MapDBs integrerede databasemotor og samlingsramme.

Vi startede med at se på kerneklasserne DB og DBMaker til at konfigurere, åbne og administrere vores database. Derefter gik vi gennem nogle eksempler på datastrukturer, som MapDB tilbyder for at arbejde med vores optegnelser. Endelig så vi på fordelene ved MapDB i forhold til en traditionel database eller Java Collection.

Som altid er eksempelkoden tilgængelig på GitHub.


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