JAVA - ORM

JAVA - ORM

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

user32

Well-known member
מנהל
מה שאתה כותב לא נשמע תקין

ראשית, אין סיבה שתהיה התחברות איטית. בגדול, הייברנט כמו כמעט כל הספריות DB של ג'אווה הוא בסה"כ מעטפת מעל JDBC. כדאי לבדוק מה גורם להתחברות איטית. הייתי מתחיל מלעשות חיבור JDBC פשוט (3 שורות קוד), לבדוק את המהירות ואז תדע אם הבעיה בהתחברות או במקום אחר.

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

יש קריאה לפונקציה בסטאפ שלוקחת המון זמן. Configuration::buildSessionFactory. גם אחרי זה כלסלקט או אינסרט הרבה יותר איטי מאשר פתיחת חיבור רגיל.
כשאני פותח connection רגיל ב-JDBC זה הרבה יותר מהיר. גם כשהשתמשתי ב-JOOK זה היה משעותית יותר מהיר. כשאני מתחבר לשרת הלוקלי זה לוקח כמה שניות אבל זה סביר. כשאני מתחבר לשרת האמיתי, זה לוקח ממש הרבה זמן (עשרות שניות ויותר). זה גם כי מהירות הרשת שלי נמוכה אבל זה קיצוני ביותר כשאני משתמש בHIBERNATE.
הערה, אני משתמש בהגדות מתוך הקוד ולא מ-XML. זה משנה?
אלו הם ההגדרות שאני שם
קוד:
props.put("hibernate.dialect", "com.example.JsonPostgreSQLDialect");
props.put("hibernate.connection.driver_class","org.postgresql.Driver");
props.put("hibernate.connection.url", "url");
props.put("hibernate.connection.username", "username");
props.put("hibernate.connection.password", "password");
props.put("hibernate.current_session_context_class", "thread");
JsonPostgreSQLDialect זה משהו שמצאתי ברשת. זה יורש מהדיאלקט הרגיל של פוסטגרס ותומך ב-JSON.
 

user32

Well-known member
מנהל
זה נראה בסדר

XML או בקוד לא משנה. מאחורה זה אותו דבר.
אם זה תקוע ל20 שניות אז כנראה פעולה ספציפית מסויימת תוקעת אותו. נראה לי שפרופיילר פשוט יקפיץ לך מיד את השורה. הניחוש שלי זה שהייברנט שולח איזה פרמטר מיותר לדרייבר, משהו כמו make_connection_slow=true שתוקע לך הכל.
אה, עוד משהו: תפעיל לוגים ברמה הכי גבוהה ותקווה שמודפס איפשהו הjdbc URL ועוד דברים מועילים. יש מצב שזה לבד יספיק למציאת הבעיה.
 
עשיתי בנצ'מרק קטן

JDBC:
שרת מרוחק: 1.3 שניות. לוקלי 0.2 שניות.
HIBERNATE:
שרת מרוחק: 200 שניות. לוקלי 2.7 שניות.
כלומר יש הבדלי מהירות וזה טבעי, גם כי האינטרנט שלי לא מספיק מהיר. אבל ב-JDBC ההבדל הוא פי 7 ובהיברנייט הוא יותר מפי 70. ההאיטיות נמשכת לאורך כל הפקודות. כל פקודה הרבה יותר איטית.
אני אנסה את הלוגים, הבעיה היא שביטלתי את הלוגים של כל הקוד שאינו שלי.
עכשיו אני צריך לקמפל מחדש כדי להוסיף את הלוגים HIBERNATE. האמת היא שאני אעיף את המעטפת שלי ואקנפג ישר את LOG4J מהקובץ.
הנה ראייה קלאסית למה השימוש במעטפת שלי "שתעזור" לי לא נכון.
 

zaske

New member
מוזר מאוד, משהו באמת מוזר אצלך

אנחנו עובדים במדינת עולם שלישי בקטע של אינטרנט (יסלחו לי האוזים),
יש לנו דטהסנטר שלנו שמשרת לקוחות באוסטרליה (סיפור ארוך למה ככה ולא אמאזון), ואני יכול להגיד לך חד משמעית שאצל הלקוחות שלנו ההבדים הם לא של פי 70 וכו'.
חלק מהקוד שלנו הוא spring jdbc וחלק הוא hibernate .

בהמשך להערות של user32 , להדגיר את הלוגינג שלך ככה שישפוך את כל org.hibernate

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

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

תודה!
 

zaske

New member
עוד משהו

מאוד מאוד תלוי גם איך יצרת את ה session factory .
האם יש לך connection pool מאחורי הקלעים?
אני כמעט בטוח שגם יש לך איזה TransactionManager , כל זה משפיע על ביצועי הזמנים שלך.

אני לא זוכר אם אפשר לייצר session או session factory ישירות מ connection, אין לי ספק שמקסימום עם קצת חציבה ויצירתיות זה אפשרי.

לא מסכים לגמרי להערה שלך.

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

וכשאני מכניס X יוזרים יחד אני לא פותח X טרנזקציות אלא אחת.
לא הגדרתי connection pool, אבל הבעיה היא כבר בשלב האתחול זה יכול להשפיע כבר אז?
&nbsp
מדובר באתרי מכירות אז אני מכניס יוזרים, רכישות וכדומה.
מה שדיברתי על המעטפת זה על מעטפת של לוגים שעשיתי לי וזה היה בהקשר של השרשור של הלוגים.
&nbsp
 

zaske

New member
קצת קשה לעזור לך בלי לראות קוד, לצערי.

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

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

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

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

choo

Active member
אם מדובר בריצה על לינוקס - אפשר לבדוק עם strace

&nbsp
קרא התעוד של הפקודה - היא מאפשרת להריץ אפליקציה ולעקוב אחרי כל קריאות המערכת שהאפליקציה מבצעת. באופן אישי השתמשתי בה הרבה פעמים כשהיו בעיות מערכת כמו אלו שאתה מתאר.
 

zaske

New member
לדעתי יש לך זבל מיותר בקונפיגורציה

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

בלי זה, לדבג דרך הפורום לא יעבוד.
 
למעלה