מהו האלגוריתם Hi / Lo?

1. הקדמה

במדריך זה נסביר את האלגוריתם Hi / Lo. הוא משמש בעיקר כ אסטרטגיית יצירת מזהים בסיס נתונים.

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

2. סקירת אלגוריתם היי / לו

2.1 הגדרה

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

ה incrementSize משתנה מכיל את המספר המרבי של מזהים שניתן ליצור באצווה אחת. יש להתייחס אליו כאל ערך קבוע המוגדר בתחילת האלגוריתם. כל שינוי בזמן ריצה עלול לגרום לבעיות חמורות בסביבות בהן מספר לקוחות משתמשים באותה תצורת Hi / Lo כדי לערוך קביעות.

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

ה נָמוּך המשתנה מחזיק את המספר שהוקצה כעת בטווח [0, incrementSize).

בהתחשב בנקודות אלה, האלגוריתם Hi / Lo מייצר ערכים בטווח [(היי – 1) * incrementSize + 1, (היי * תוספת גודל)).

2.2 פסאודוקוד

בואו נסתכל על השלבים ליצירת ערך חדש באמצעות האלגוריתם Hi / Lo:

  • אם נָמוּך גדול או שווה ל- incrementSize, הקצה ערך חדש ל- גָבוֹהַ ולאפס נָמוּך ל -0
  • ליצור ערך חדש עם הנוסחה: (גָבוֹהַ – 1) * incrementSize + נָמוּך
  • תוֹסֶפֶת נָמוּך לפי 1
  • להחזיר את הערך שנוצר

3. דוגמה מעשית

בואו נראה את האלגוריתם Hi / Lo בפעולה. לשם כך נשתמש במסגרת ה- Hibernate וביישום ה- Hi / Lo שלה.

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

@Entity מחלקה ציבורית RestaurantOrder {@Id @GeneratedValue (אסטרטגיה = GenerationType.SEQUENCE, מחולל = "hilo_sequence_generator") @ GenericGenerator (שם = "hilo_sequence_generator", אסטרטגיה = "רצף", פרמטרים = {@ Parameter (שם = "שם רצף", value = "hilo_seqeunce"), @Parameter (name = "initial_value", value = "1"), @Parameter (name = "increment_size", value = "3"), @Parameter (name = "optimizer", value = "הילה")}) פרטי מזהה ארוך; }

זו הזמנת מסעדה פשוטה עם אחת תְעוּדַת זֶהוּת שדה. כדי להגדיר נכון את האלגוריתם Hi / Lo ב- Hibernate, בהגדרת ה- תְעוּדַת זֶהוּת שדה, עלינו לבחור a סדר פעולות אסטרטגיה - היילו אופטימיזציה - וציין את גודל תוספת פָּרָמֶטֶר.

כדי להציג את האלגוריתם Hi / Lo בפעולה, נקיים תשע הזמנות מסעדות בלולאה:

חלל ציבורי נמשך () {Transaction transaction = session.beginTransaction (); עבור (int i = 0; i <9; i ++) {session.persist (RestaurantOrder חדש ()); session.flush (); } transaction.commit (); }

על פי גודל התוספת שצוין בישות, עלינו לקיים שלוש שיחות בלבד למסד הנתונים עבור הבא גָבוֹהַ ערך. בהנחה שרצף מסד הנתונים מתחיל מ -1, האצווה הראשונה של מזהים שנוצרו תהיה בטווח [1,3].

כאשר האלגוריתם Hi / Lo מחזיר 3 ו- Hibernate מבקש את ערך המזהה הבא, את הערך של נָמוּך משתנה שווה ל- incrementSize קָבוּעַ. במקרה כזה, השיחה הבאה למסד הנתונים עבור החדש גָבוֹהַ יש לעשות ערך. יש 2 כחדשים גָבוֹהַ ערך, האלגוריתם מייצר ערכים בטווח [4,6].

לבסוף, השיחה האחרונה למסד הנתונים הבאה גָבוֹהַ ערך נוצר, וערכים בטווח [7, 9] מוקצים לישויות.

יומני תרדמה שנתפסו במהלך ביצוע ה- להתמיד() שיטה לאשר את אותם ערכים:

Hibernate: התקשר לערך הבא עבור hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - ערך רצף שהושג: 1 org.hibernate.event.internal.AbstractSaveEventListener - מזהה שנוצר: 1, תוך שימוש באסטרטגיה: org.hibernate.id.enhanced.SequenceStyleGtyle .hibernate.event.internal.AbstractSaveEventListener - מזהה שנוצר: 2, תוך שימוש באסטרטגיה: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - מזהה שנוצר: 3, באמצעות אסטרטגיה: org.hibernate.id. משופרת.SequenceStyleGenerator שינה: התקשר לערך הבא עבור hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - ערך רצף שהושג: 2 org.hibernate.event.internal.AbstractSaveEventListener - מזהה שנוצר: 4, תוך שימוש באסטרטגיה: org.hibernate.id. .SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - מזהה שנוצר: 5, תוך שימוש באסטרטגיה: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal. AbstractSaveEventListener - מזהה שנוצר: 6, תוך שימוש באסטרטגיה: org.hibernate.id.enhanced.SequenceStyleGenerator Hibernate: התקשר לערך הבא עבור hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - ערך רצף שהושג: 3 org.hibernate.eventbent. - מזהה שנוצר: 7, תוך שימוש באסטרטגיה: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - מזהה שנוצר: 8, תוך שימוש באסטרטגיה: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event .internal.AbstractSaveEventListener - מזהה שנוצר: 9, תוך שימוש באסטרטגיה: org.hibernate.id.enhanced.SequenceStyleGenerator

4. יתרונות וחסרונות באלגוריתם

היתרון העיקרי של האלגוריתם Hi / Lo הוא מספר מופחת של שיחות בסיס נתונים לערכי הרצף הבאים. הגדלת הערך של incrementSize מקטין את מספר ההסעות הלוך ושוב למסד הנתונים. ברור שזה אומר רווח ביצועים ביישום שלנו. בנוסף לכך, האלגוריתם Hi / Lo הוא a בחירה מועדפת בסביבות עם חיבור לאינטרנט חלש.

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

5. מסקנה

במדריך זה דנו באלגוריתם Hi / Lo.

ראשית, הסברנו כיצד זה עובד ודנו ביישום הפסבדוקוד שלו. לאחר מכן, הראינו דוגמה מעשית באמצעות יישום האלגוריתם של Hibernate. לבסוף, פירטנו יתרונות וחסרונות של Hi / Lo.

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


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