פרוקסי בשיטת עומס שינה ()

1. סקירה כללית

במדריך זה נראה מה זה פרוקסי בהקשר למצב שינה לִטעוֹן() שיטה.

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

2. מבוא קצר לפרוקסי ו לִטעוֹן() שיטה

מעצם הגדרתו, מיופה כוח הוא "תפקיד המוסמך לשמש כסגן או תחליף לאחר".

זה חל על מצב שינה כאשר אנו מתקשרים Session.load () ליצור מה שמכונה פרוקסי שאינו מאושר של מעמד היישות הרצוי שלנו.

במילים פשוטות, מצב שינה הוא מחלק את תת המחלקות שלנו באמצעות ה- CGLib סִפְרִיָה. חוץ מה @תְעוּדַת זֶהוּת השיטה, יישום ה- proxy מאציל את כל שיטות המאפיין האחרות למפגש שינה כדי לאכלס את המופע, בערך כמו:

מחלקה ציבורית HibernateProxy מרחיב את MyEntity {יעד MyEntity פרטי; מחרוזת ציבורית getFirstName () {if (target == null) {target = readFromDatabase (); } להחזיר target.getFirstName (); }}

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

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

3. פרוקסי ועצלנים טוען

3.1. ישות יחידה

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

אם נשתמש Session.load () ליצור אינסטנט עוֹבֵד:

עובד אלברט = session.load (שכיר עובדים, חדש ארוך (1));

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

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

מחרוזת firstName = albert.getFirstName ();

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

אם היא לא מצליחה למצוא שורה, אז שינה תרדמה ObjectNotFoundException.

3.2. יחסים אחד לרבים

עכשיו, בואו ניצור חֶברָה ישות גם כן, שם א חֶברָה יש לו הרבה עובדים:

חברה בכיתה ציבורית {שם מחרוזת פרטי; עובדים סטים פרטיים; }

אם הפעם נשתמש Session.load () על החברה:

Company bizco = session.load (Company.class, חדש ארוך (1)); שם מחרוזת = bizco.getName ();

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

ראה, ביררנו רק לשורת החברה, אך ה- proxy ישאיר את העובד לבד עד שנתקשר קבל עובדים תלוי באסטרטגיית האחזור.

3.3. קשרים רבים לאחד

המקרה דומה בכיוון ההפוך:

שכבה ציבורית עובד {פרטי מחרוזת firstName; מקום עבודה פרטי של החברה; }

אם נשתמש לִטעוֹן() שוב:

עובד בוב = session.load (שכיר עובד, חדש ארוך (2)); שם מחרוזת = bob.getFirstName ();

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

4. טוען עצלן

עַכשָׁיו, לִטעוֹן() לא תמיד ייתן לנו פרוקסי לא מאוחד. למעשה, ה מוֹשָׁב java doc מזכיר לנו (הדגשה הוסיפה):

השיטה הזאת אולי להחזיר מופע סגור שמאותחל על פי דרישה, כאשר ניגשת לשיטה שאינה מזהה.

דוגמה פשוטה למתי זה יכול לקרות היא בגודל אצווה.

בואו נגיד שאנחנו משתמשים @BatchSize על שלנו עוֹבֵד יֵשׁוּת:

@Entity @BatchSize (גודל = 5) עובד בכיתה {// ...}

והפעם יש לנו שלושה עובדים:

עובד קתרין = session.load (שכיר עובד, חדש ארוך (3)); דרל לעובד = session.load (שכיר עובדים, חדש ארוך (4)); עובד אמה = session.load (שכיר עובד, חדש ארוך (5));

אם נתקשר getFirstName עַל קתרין:

מחרוזת cathy = catherine.getFirstName ();

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

ואז, כשאנחנו קוראים דארלהשם הפרטי:

מחרוזת דארל = darrell.getFirstName ();

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

5. עומס להוט

5.1. באמצעות לקבל()

אנחנו יכולים גם לעקוף לחלוטין את ה- proxies ולבקש מ- Hibernate לטעון את הדבר האמיתי באמצעות Session.get ():

עובד פיניגן = session.get (שכיר עובד, ארוך ארוך (6));

זה יקרא מיד למסד הנתונים, במקום להחזיר פרוקסי.

ובעצם, במקום ObjectNotFoundException, זה יחזור ריק אם פיניגן לא קיים.

5.2. השלכות ביצועים

בזמן לקבל() זה נוח, לִטעוֹן() יכול להיות קל יותר במסד הנתונים.

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

עובד ג'רלד = session.get (שכיר עובד, חדש ארוך (7)); חברה worldco = (חברה) session.load (Company.class, חדש ארוך (2)); employee.setCompany (worldco); session.save (עובד);

מכיוון שאנחנו יודעים שאנחנו רק הולכים לשנות את עוֹבֵד שיא במצב זה, יִעוּד לִטעוֹן() ל חֶברָה הוא הגיוני.

אם התקשרנו לקבל() עַל חֶברָהואז היינו טוענים את כל הנתונים שלו ללא צורך ממסד הנתונים.

6. מסקנה

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

כמו כן, בדקנו במהירות כיצד לִטעוֹן() שונה מ לקבל().

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


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