נטען להוט / עצלן במצב שינה

עליון התמדה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. הקדמה

כשעובדים עם ORM, ניתן לסווג אחזור / טעינה של נתונים לשני סוגים: להוטים ועצלנים.

במאמר מהיר זה אנו הולכים להצביע על הבדלים ולהראות שניתן להשתמש בהם במצב שינה.

2. תלות Maven

כדי להשתמש במצב שינה, בואו נגדיר תחילה את התלות העיקרית שלנו pom.xml:

 org.hibernate hibernate-core 5.2.2.Final 

הגרסה האחרונה של Hibernate נמצאת כאן.

3. עומס להוט ועצלן

הדבר הראשון שעלינו לדון כאן הוא מה עומס עצל ועומס להוט:

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

בואו נראה איך זה עובד בפועל עם כמה דוגמאות:

ה UserLazy מעמד:

@Entity @Table (name = "USER") UserLazy מחלקה ציבורית מיישמת באמצעות Serialize {@Id @GeneratedValue @Column (name = "USER_ID") פרטי UserId ארוך; @OneToMany (fetch = FetchType.LAZY, mappedBy = "user") פרטי הגדר orderDetail = HashSet חדש (); // סטרים וקובעים סטנדרטיים // גם עוקפים שווה ו- hashcode}

ה פרטי הזמנה מעמד:

@Entity @Table (name = "USER_ORDER") מחלקה ציבורית OrderDetail מיישמת ניתן לסידור {@Id @GeneratedValue @Column (name = "ORDER_ID") פרטי OrderId ארוך; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn (name = "USER_ID") משתמש UserLazy פרטי; // סטרים וקובעים סטנדרטיים // עוקפים גם שווה ו- hashcode}

אחד מִשׁתַמֵשׁ יכול להיות מרובה פרטי הזמנה. באסטרטגיית טעינה להוטה, אם נטען את מִשׁתַמֵשׁ נתונים, הוא גם יטען את כל ההזמנות המשויכות אליו ויאחסן אותו בזיכרון.

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

בחלק הבא נראה כיצד מיושמת הדוגמה לעיל במצב שינה.

4. טעינת תצורה

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

ניתן פשוט להפעיל טעינה עצלה באמצעות פרמטר ההערות הבא:

אחזור = FetchType.LAZY

כדי להשתמש בהבאת הלהיטות נעשה שימוש בפרמטר הבא:

אחזור = FetchType.EAGER

כדי להגדיר טעינה נלהבת השתמשנו בה UserLazyקוראים לכיתה תאומה UserEager.

בחלק הבא נבחן את ההבדלים בין שני סוגי האחזור.

5. הבדלים

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

בואו נסתכל על הדוגמה הזו:

משתמשים ברשימה = sessionLazy.createQuery ("מ- UserLazy"). List (); UserLazy userLazyLoaded = users.get (3); להחזיר (userLazyLoaded.getOrderDetail ());

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

UserLazy userLazyLoaded = users.get (3);

אבל עם גישה נלהבת פנימה UserEager זה יאותחל מיד בשורה הראשונה של הדוגמה לעיל:

רשימה משתמש = sessionEager.createQuery ("מ- UserEager"). List ();

לטעינה עצלה משתמשים באובייקט proxy ובו שאילתת SQL נפרדת לטעינת ה- orderDetailSet .

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

ניתן להשתמש בשיטה הבאה לבדיקת הפונקציונליות שלעיל:

Hibernate.isInitialized (orderDetailSet);

עכשיו חשוב לבחון את השאילתות שנוצרות בשני המקרים:

נָכוֹן

ההגדרה לעיל ב fetching.hbm.xml מציג את שאילתות ה- SQL שנוצרות. אם תסתכל על פלט קונסולה, תוכל לראות שאילתות שנוצרו.

עבור Lazy Loading השאילתה שנוצרת לטעינת ה- מִשׁתַמֵשׁ נתונים:

בחר משתמש0_.USER_ID כ- USER_ID1_0_, ... ממשתמש USER0_

עם זאת, בעומס להוט, ראינו יצירת קשר USER_ORDER:

בחר orderdetai0_.USER_ID כ- USER_ID4_0_0_, orderdetai0_.ORDER_ID כ- ORDER_ID1_1_0_, orderdetai0_ ... מ USER_ORDER orderdetai0_ איפה orderdetai0_.USER_ID =?

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

6. יתרונות וחסרונות

6.1. טעינה איטית

יתרונות:

  • זמן הטעינה הראשוני קטן בהרבה מאשר בגישה האחרת
  • פחות זיכרון מאשר בגישה האחרת

חסרונות:

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

6.2. טוען בשקיקה:

יתרונות:

  • אין השפעות ביצועים מאוחרות על אתחול

חסרונות:

  • זמן טעינה ראשוני ארוך
  • טעינת נתונים מיותרים מדי עשויה להשפיע על הביצועים

7. טעינה עצלה במצב שינה

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

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

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

למידע נוסף על דפוס עיצוב פרוקסי תוכלו להפנות כאן.

8. מסקנה

במאמר זה הראינו דוגמאות לשני סוגי האחזור העיקריים המשמשים במצב שינה.

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

תחתית התמדה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס