Java डेवलपर इंटरव्यू सवाल

आपका endpoint हर request पर सैकड़ों queries चला रहा है। JPA के साथ ऐसा कैसे होता है और आप इसे कैसे ठीक करेंगे?

इंटरव्यूअर असल में क्या परख रहा है, अपना जवाब कैसे स्ट्रक्चर करें, और एक बोला हुआ उदाहरण जिसे आप अपना सकते हैं।

छोटा जवाब

यह N plus one की दिक्कत है: एक query parent rows लाती है, फिर हर row पर किसी lazy association को छूना हर row के लिए एक और query चला देता है। इसे ठीक करें उसी query में join fetch या entity graph से association लाकर, या batch fetch size सेट करके ताकि Hibernate associations को समूहों में लाए, या सीधे उन्हीं columns वाले DTO में project करके जो आपको चाहिए। associations डिफॉल्ट रूप से lazy रखें और हर use case के हिसाब से eagerly fetch करें।

इंटरव्यूअर यह क्यों पूछते हैं

Spring और Hibernate applications में यह सबसे आम परफॉर्मेंस बग है, तो इंटरव्यूअर जानना चाहते हैं कि आप इसे logs से पहचान सकते हैं और सब कुछ eager किए बिना ठीक कर सकते हैं। वे सुनना चाहते हैं कि fetch strategy mapping की नहीं, query की चीज है, साथ में जुड़ी हुई दिक्कतों की समझ: session के बाहर lazy initialization, open session in view, और दो collections जोड़ने से बनने वाले Cartesian products।

अपना जवाब कैसे स्ट्रक्चर करें

  • पैटर्न का नाम लें और बताएं कि अतिरिक्त queries किससे चलती हैं।
  • क्रम से उपाय दें: join fetch, entity graph, batch size, projection।
  • इस पर अड़ें कि mappings lazy रहें और fetching queries तय करें।
  • पहचान का जिक्र करें: SQL लॉग करें या tests में query count पर assert लगाएं।

उदाहरण जवाब

बोला हुआ उदाहरण, पहले व्यक्ति में

यह N plus one है। मैं एक query में orders का एक पेज लाता हूं, फिर serializer हर एक पर order.getItems छूता है, और association lazy होने की वजह से Hibernate हर एक order के लिए वापस जाता है। बीस orders इक्कीस queries बन जाते हैं, और यह सिर्फ असली डेटा पर दिखता है। पहला उपाय यह है कि जो चाहिए वह एक ही बार में ले आऊं, या तो join fetch वाली query से या repository method पर named entity graph से, ताकि items parents के साथ ही आ जाएं। अगर मुझे दो अलग collections चाहिए तो मैं दोनों को join नहीं करता, क्योंकि इससे rows गुणा होकर Cartesian product बन जाते हैं; इसकी जगह मैं batch fetch size सेट करता हूं ताकि Hibernate उन्हें, मान लीजिए, पचास के batches में in clause के साथ लाए, यानी सौ की जगह दो queries। अक्सर असली जवाब यह होता है कि endpoint को entities चाहिए ही नहीं, तो मैं सीधे उन्हीं columns वाले DTO में project कर देता हूं जो जरूरी हैं। जो मैं नहीं करता वह है mapping को eager कर देना, क्योंकि इससे एक endpoint ठीक होता है और बाकी हर endpoint धीमा हो जाता है। इसे ईमानदार रखने के लिए मैं integration test में query counts पर assert लगाता हूं।

जल्दी ही यह इंटरव्यू देने जा रहे हैं? GhostPilot आपकी लाइव कॉल सुनता है, सवाल पूछे जाते ही उसे पकड़ लेता है, और रियल-टाइम में एक स्ट्रक्चर्ड जवाब आपकी स्क्रीन पर डाल देता है। अगले मॉक में इसे आजमाएं, या ले लें एक $29 Session Pass, कोई सब्सक्रिप्शन नहीं, असली इंटरव्यू के लिए।

देखें यह कैसे काम करता है

फॉलो-अप सवाल जिनकी उम्मीद रखें

  • LazyInitializationException क्या है और आप इससे ठीक ढंग से कैसे बचते हैं?
  • open session in view को नुकसानदेह क्यों माना जाता है?
  • ऐसी query को आप कैसे page करेंगे जो collection को join fetch भी करती हो?

Java डेवलपर के और सवाल

आपका इंटरव्यूअर इसका अपना वर्ज़न पूछेगा। फ्री Question Predictor में अपना असली जॉब डिस्क्रिप्शन पेस्ट कीजिए और वो 20 सवाल पाइए जो उस रोल में सबसे ज्यादा पूछे जाने की संभावना है, साथ में यह भी कि हर सवाल असल में क्या टटोल रहा है।

मेरे सवाल प्रेडिक्ट करें

मुश्किल सवाल पूछे जाने से पहले उनकी रिहर्सल कीजिए

एक लाइव कोपायलट के साथ प्रैक्टिस कीजिए, फिर तैयार होकर अंदर जाइए। $29 Session Pass आपको इंटरव्यू पार करा देता है, न कोई सब्सक्रिप्शन, न कोई लॉक-इन।

GhostPilot पाएं