מדריך MapDB

1. הקדמה

במאמר זה נסתכל על ספריית MapDB - מנוע מסד נתונים משובץ שניתן לגשת אליו דרך ממשק API דמוי אוסף.

אנו מתחילים בחקר שיעורי הליבה DB ו DBMaker המסייעים בתצורה, פתיחה וניהול של מאגרי המידע שלנו. לאחר מכן, נצלול לכמה דוגמאות של מבני נתונים של MapDB השומרים ומאחזרים נתונים.

לבסוף, נבחן כמה ממצבי הזיכרון לפני שנשווה MapDB למסדי נתונים מסורתיים ולאוספי Java.

2. אחסון נתונים ב- MapDB

ראשית, בואו ונציג את שני השיעורים שבהם נשתמש כל הזמן במהלך הדרכה זו - DB ו DBMaker. ה DB class מייצג בסיס נתונים פתוח. השיטות שלו קוראות לפעולות ליצירה וסגירה של אוספי אחסון לטיפול ברשומות מסדי נתונים, כמו גם לטיפול באירועי עסקאות.

DBMaker מטפל בתצורת מסד נתונים, יצירה ופתיחה. כחלק מהתצורה, אנו יכולים לארח את מסד הנתונים שלנו בזיכרון או במערכת הקבצים שלנו.

2.1. פשוט מפת גיבוב דוגמא

כדי להבין איך זה עובד, בואו נקים בסיס נתונים חדש בזיכרון.

ראשית, בואו ליצור מסד נתונים חדש בזיכרון באמצעות ה- DBMaker מעמד:

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

פעם אחת שלנו DB האובייקט פועל, נוכל להשתמש בו כדי לבנות HTreeMap לעבוד עם רשומות מסדי הנתונים שלנו:

מחרוזת welcomeMessageKey = "הודעת קבלת פנים"; מחרוזת welcomeMessageString = "שלום באלדונג!"; HTreeMap myMap = db.hashMap ("myMap"). CreateOrOpen (); myMap.put (welcomeMessageKey, welcomeMessageString);

HTreeMap הוא של MapDB מפת גיבוב יישום. אז, עכשיו שיש לנו נתונים במסד הנתונים שלנו, אנחנו יכולים לאחזר אותם באמצעות ה- לקבל שיטה:

מחרוזת welcomeMessageFromDB = (מחרוזת) myMap.get (welcomeMessageKey); assertEquals (welcomeMessageString, welcomeMessageFromDB);

לבסוף, כעת, לאחר שסיימנו את מסד הנתונים, עלינו לסגור אותו כדי להימנע ממוטציות נוספות:

db.close ();

כדי לאחסן את הנתונים שלנו בקובץ, ולא בזיכרון, כל מה שאנחנו צריכים לעשות זה לשנות את הדרך שלנו DB האובייקט הוא מיידי:

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

הדוגמה שלנו לעיל אינה משתמשת בפרמטרים מסוג. כתוצאה מכך, אנו תקועים עם השלכת התוצאות שלנו לעבודה עם סוגים ספציפיים. בדוגמה הבאה שלנו נציג סדרנים כדי לבטל את הצורך בליהוק.

2.2. אוספים

MapDB כולל סוגי אוספים שונים. כדי להדגים, בואו הוסף ונאחזר כמה נתונים ממאגר המידע שלנו באמצעות ניווט ניווט, שעובד כפי שניתן היה לצפות מ- Java מַעֲרֶכֶת:

נתחיל מיידית פשוטה של ​​שלנו DB לְהִתְנַגֵד:

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

לאחר מכן, בואו ניצור את שלנו ניווט ניווט:

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

הנה ה סידור מבטיח כי נתוני הקלט ממסד הנתונים שלנו עוברים סדרת סדר וניתוח עריכה באמצעות חוּט חפצים.

לאחר מכן, בואו נוסיף נתונים:

set.add ("באלדונג"); set.add ("הוא מדהים");

עכשיו, בואו נבדוק ששני הערכים המובהקים שלנו נוספו למאגר כהלכה:

assertEquals (2, set.size ());

לבסוף, מכיוון שמדובר בערכה, בואו נוסיף מחרוזת כפולה ונוודא שמאגר הנתונים שלנו עדיין מכיל רק שני ערכים:

set.add ("באלדונג"); assertEquals (2, set.size ());

2.3. עסקאות

בדומה למאגרי מידע מסורתיים, ה- DB בכיתה מספקת שיטות ל לְבַצֵעַ ו גלגל לאחור הנתונים שאנו מוסיפים למסד הנתונים שלנו.

כדי לאפשר פונקציונליות זו, עלינו לאתחל את DB עם ה עסקה הפעלה שיטה:

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

לאחר מכן, בואו ניצור סט פשוט, נוסיף נתונים ונחייב אותו למסד הנתונים:

NavigableSet set = db .treeSet ("mySet"). Serializer (Serializer.STRING) .createOrOpen (); set.add ("אחד"); set.add ("שניים"); db.commit (); assertEquals (2, set.size ());

עכשיו, בואו להוסיף מחרוזת שלישית ולא מחויבת למסד הנתונים שלנו:

set.add ("שלוש"); assertEquals (3, set.size ());

אם אנחנו לא מרוצים מהנתונים שלנו, נוכל להחזיר את הנתונים באמצעות החזרה של DB שיטה:

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

2.4. סדרנים

MapDB מציעה מגוון גדול של סידורי, המטפלים בנתונים בתוך האוסף. פרמטר הבנייה החשוב ביותר הוא השם, שמזהה את האוסף האישי בתוך ה- DB לְהִתְנַגֵד:

HTreeMap map = db.hashMap ("שם זיהוי") .keySerializer (Serializer.STRING) .valueSerializer (Serializer.LONG) .create ();

בעוד שסידור מומלץ, הוא אופציונלי וניתן לדלג עליו. עם זאת, ראוי לציין כי הדבר יוביל לתהליך סידורי כללי איטי יותר.

3. HTreeMap

MapDB HTreeMap מספק מפת גיבוב ו HashSet אוספים לעבודה עם בסיס הנתונים שלנו. HTreeMap הוא עץ חשיש מפולח ואינו משתמש בטבלת חשיש בגודל קבוע. במקום זאת, הוא משתמש בעץ אינדקס המתרחב אוטומטית ואינו שוטף מחדש את כל הנתונים שלו ככל שהטבלה גדלה. לסיום, HTreeMap הוא חוט בטוח ותומך בכתיבה מקבילה באמצעות מספר קטעים.

כדי להתחיל, בואו נפתח פשוט מפת גיבוב שמשתמש חוּט הן למפתחות והן לערכים:

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

למעלה, הגדרנו נפרדים סדרנים עבור המפתח והערך. עכשיו שלנו מפת גיבוב נוצר, בואו נוסיף נתונים באמצעות ה- לָשִׂים שיטה:

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

כפי ש מפת גיבוב עובד על HashCode של האובייקט שיטה, הוספת נתונים באמצעות אותו מפתח גורם להחלפת הערך:

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

4. SortedTableMap

MapDB SortedTableMap מאחסן מפתחות בטבלה בגודל קבוע ומשתמש בחיפוש בינארי לצורך אחזור. ראוי לציין כי לאחר שהמפה הוכנה, היא לקריאה בלבד.

בואו נעבור את התהליך של יצירת שאילתות SortedTableMap. נתחיל ביצירת נפח ממופה זיכרון להחזקת הנתונים, כמו גם כיור להוספת נתונים. בהפעלה הראשונה של הכרך שלנו, נגדיר את הדגל לקריאה בלבד שֶׁקֶר, להבטיח שנוכל לכתוב לכרך:

מחרוזת VOLUME_LOCATION = "sortedTableMapVol.db"; נפח נפח = MappedFileVol.FACTORY.makeVolume (VOLUME_LOCATION, false); SortedTableMap.Sink כיור = SortedTableMap.create (כרך, Serializer.INTEGER, Serializer.STRING) .createFromSink ();

לאחר מכן נוסיף את הנתונים שלנו ונקרא ל- לִיצוֹר שיטה על הכיור כדי ליצור את המפה שלנו:

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

כעת, כאשר קיימת המפה שלנו, אנו יכולים להגדיר נפח לקריאה בלבד ולפתוח את המפה שלנו באמצעות SortedTableMap פתוח שיטה:

נפח openVol = MappedFileVol.FACTORY.makeVolume (VOLUME_LOCATION, נכון); SortedTableMap sortedTableMap = SortedTableMap .open (openVol, Serializer.INTEGER, Serializer.STRING); assertEquals (100, sortedTableMap.size ());

4.1. חיפוש בינארי

לפני שנמשיך הלאה, בואו נבין איך SortedTableMap משתמש בחיפוש בינארי בפירוט רב יותר.

SortedTableMap מחלק את האחסון לדפים, כאשר כל עמוד מכיל מספר צמתים המורכבים ממפתחות וערכים. בתוך צמתים אלה נמצאים צמדי ערך המפתח שאנו מגדירים בקוד ה- Java שלנו.

SortedTableMap מבצע שלוש חיפושים בינאריים כדי לאחזר את הערך הנכון:

  1. מפתחות לכל עמוד מאוחסנים בערימה במערך. ה SortedTableMap מבצע חיפוש בינארי כדי למצוא את העמוד הנכון.
  2. לאחר מכן מתרחשת שחרור לחץ על כל מפתח בצומת. חיפוש בינארי קובע את הצומת הנכון, בהתאם למפתחות.
  3. סוף - סוף, ה SortedTableMap מחפש את המפתחות בתוך הצומת כדי למצוא את הערך הנכון.

5. מצב בזיכרון

MapDB מציע שלושה סוגים של חנות בזיכרון. בואו נסתכל במהירות על כל מצב, להבין איך זה עובד, וללמוד את היתרונות שלו.

5.1. בערימה

המצב בערימה מאחסן אובייקטים באוסף Java פשוט מַפָּה. זה אינו משתמש בסידור ויכול להיות מהיר מאוד עבור מערכי נתונים קטנים.

עם זאת, מכיוון שהנתונים מאוחסנים בערימה, מערך הנתונים מנוהל על ידי איסוף אשפה (GC). משך ה- GC עולה עם גודל מערך הנתונים, וכתוצאה מכך ירידות ביצועים.

בואו נראה דוגמה המציינת את מצב הגיבוב:

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

5.2. בתים []

סוג החנות השני מבוסס על מערכי בתים. במצב זה, הנתונים מסודרים ומאוחסנים במערכים בגודל של עד 1MB. אמנם מבחינה טכנית בערימה, שיטה זו יעילה יותר לאיסוף אשפה.

זה מומלץ כברירת מחדל, והיה בשימוש ב 'שלום באלדונג ' דוגמא:

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

5.3. DirectByteBuffer

החנות הסופית מבוססת על DirectByteBuffer. זיכרון ישיר, שהוצג בג'אווה 1.4, מאפשר העברת נתונים ישירות לזיכרון מקורי ולא לג'אווה. כתוצאה מכך הנתונים יאוחסנו לגמרי לא ערימה.

אנו יכולים להפעיל חנות מסוג זה עם:

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

6. מדוע MapDB?

אז למה להשתמש ב- MapDB?

6.1. MapDB לעומת מסד נתונים מסורתי

MapDB מציעה מגוון גדול של פונקציונליות מסד נתונים המוגדרת עם כמה שורות קוד Java. כאשר אנו מעסיקים את MapDB, אנו יכולים להימנע מהתקנה הגוזלת לעתים קרובות של שירותים וקשרים שונים הדרושים בכדי לגרום לתוכנית שלנו לעבוד.

מעבר לכך, MapDB מאפשר לנו לגשת למורכבות של מסד נתונים עם היכרות של אוסף Java. ב- MapDB איננו זקוקים ל- SQL ונוכל לגשת לרשומות באמצעות פשוט לקבל שיחות שיטה.

6.2. MapDB לעומת אוספי Java פשוטים

אוספי ג'אווה לא ישמרו על נתוני היישום שלנו לאחר הפסקת הביצוע. MapDB מציע שירות פשוט, גמיש וניתוח, המאפשר לנו להחזיק במהירות ובקלות את הנתונים ביישום שלנו תוך שמירה על התועלת של סוגי אוספי Java.

7. מסקנה

במאמר זה, צללנו עמוק לתוך מנוע מסד הנתונים המוטבע ומסגרת האיסוף המשובצת של MapDB.

התחלנו בבחינת שיעורי הליבה DB ו DBMaker כדי להגדיר, לפתוח ולנהל את מסד הנתונים שלנו. לאחר מכן, עברנו על כמה דוגמאות של מבני נתונים ש- MapDB מציעה לעבוד עם הרשומות שלנו. לבסוף בדקנו את היתרונות של MapDB על בסיס מסד נתונים מסורתי או Java Collection.

כמו תמיד, קוד הדוגמה זמין ב- GitHub.


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