2016-08-14 9 views
5

में हाइबरनेट @Query विधि का समांतर निष्पादन मेरे पास एक डैशबोर्ड दृश्य है, जिसके लिए पूरे डेटाबेस में तालिकाओं से डेटा के छोटे सेट की आवश्यकता होती है। मैंने डेटाबेस क्वेरीज़ को अनुकूलित किया (उदा। उप-प्रश्न हटा दिए गए)। अब ~ 20 प्रश्न हैं जो एक के बाद एक निष्पादित किए जाते हैं, और जो डेटाबेस से अलग-अलग डेटा सेट ला रहे हैं। अधिकांश एचक्यूएल प्रश्नों में GROUP BY और JOIN क्लॉज शामिल हैं। एक वसंत आरईएसटी इंटरफेस के साथ, परिणाम सामने के अंत में वापस आ गया है।स्प्रिंग डेटा क्वेरी निष्पादन अनुकूलन: JpaRepository

मैं कस्टम प्रश्नों के निष्पादन को कैसे अनुकूलित करूं? मेरा प्रारंभिक विचार समानांतर में डेटाबेस प्रश्नों को चलाने के लिए था। लेकिन मैं इसे कैसे प्राप्त करूं? कुछ शोध करने के बाद मुझे एनोटेशन @Async मिला जो समानांतर में विधियों को चलाने में सक्षम बनाता है। लेकिन क्या यह हाइबरनेट विधियों के साथ काम करता है? क्या JpaRepository में @Query के साथ एनोटेटेड प्रत्येक विधि के लिए हमेशा एक नया डेटाबेस सत्र बनाया गया है? क्या डेटाबेस क्वेरी चलाना पूरे निष्पादन समय पर प्रभाव डालता है?

समानांतर में डेटाबेस कॉल चलाने का एक और तरीका, डैशबोर्ड कॉल को कई एकल अजाक्स कॉल में विभाजित कर रहा है (प्रत्येक चिंता को अपना स्वयं का अजाक्स कॉल मिलता है)। मैं ऐसा नहीं करना चाहता था, क्योंकि हर बार डैशबोर्ड खोला जाता है (या उदा। तिथि सीमा बदल जाती है), नया डेटा लाने के लिए एक और 20 अजाक्स कॉल किए जाते हैं। और वही प्रश्न बनी हुई है: क्या समानांतर में SQL क्वेरी चलाना डेटाबेस के निष्पादन समय पर प्रभाव डालता है?

मैंने वर्तमान में डेटाबेस में अतिरिक्त इंडेक्स नहीं जोड़े हैं। यह अगली बात होगी, मैं निश्चित रूप से करूँगा। हालांकि, मुझे समांतर में प्रश्नों को चलाने और वसंत के साथ प्रोग्रामेटिक रूप से कैसे प्राप्त किया जाए, इसके प्रदर्शन प्रभावों पर रूचि है।

मेरे परियोजना शुरू में jHipster (स्प्रिंग बूट, MariaDB, AngularJS आदि) द्वारा उत्पन्न की गई

उत्तर

6

पहले, समानांतर में इन SQLs चल डेटाबेस पर असर नहीं पड़ेगा और यह केवल पृष्ठ लोड को तेज़, तो डिजाइन होगा उस पर ध्यान देना चाहिए।

मैं यह जवाब मान रहा हूं कि आप पहले से ही यह सुनिश्चित कर चुके हैं कि आप इन 20 एसक्यूएल को गठबंधन नहीं कर सकते क्योंकि डेटा असंबंधित है (कोई भी शामिल नहीं है, विचार, आदि)।

मैं 2 कारणों से @Async का उपयोग करने के खिलाफ सलाह दूंगा।

कारण 1 - एक असीमित कार्य बहुत अच्छा होता है जब आप कार्यों का एक गुच्छा आग लगाना चाहते हैं और भूल जाते हैं, या जब आप जानते हैं कि सभी कार्य कब पूरा होंगे। तो आपको अपने सभी असीमित कार्यों को पूरा करने के लिए "प्रतीक्षा" करने की आवश्यकता होगी। आप कब तक इंतजार करना चाहिए? धीमी क्वेरी पूरी होने तक?

चेक Async के लिए यह कोड का नमूना (गाइड से @ spring.io - https://spring.io/guides/gs/async-method/)

// Wait until they are all done 
while (!(page1.isDone() && page2.isDone() && page3.isDone())) { 
    Thread.sleep(10); //10-millisecond pause between each check 
} 

विल/चाहिए 20 Async डीएओ क्वेरी के लिए आपके सेवा घटक इंतजार?

कारण 2 - याद रखें कि Async केवल थ्रेड के रूप में कार्य को दूर कर रहा है। चूंकि आप जेपीए के साथ काम करने जा रहे हैं, याद रखें कि एंटिटी मैनेजर थ्रेड-सुरक्षित नहीं हैं। और डीएओ कक्षाएं लेनदेन का प्रचार करेगी। यहां उन समस्याओं का एक उदाहरण दिया गया है जो फसल हो सकते हैं - http://alexgaddie.blogspot.com/2011/04/spring-3-async-with-hibernate-and.html

आईएमएचओ, कई अजाक्स कॉल के साथ आगे बढ़ना बेहतर है, क्योंकि इससे आपके घटक एकजुट हो जाएंगे। हां, आपके पास 20 अंतराल होंगे, लेकिन उनके पास एक सरल डीएओ, सरल एसक्यूएल, आसानी से यूनिट टेस्टेबल होगा और लौटा डेटा संरचना AngularJS विजेट्स को संभाल/पार्स करना आसान होगा।जब यूआई सभी 20 अजाक्स कॉल ट्रिगर करता है, तो डैशबोर्ड एक ही समय में उन सभी को लोड करने के बजाय, अलग-अलग विजेट लोड कर देगा। इससे आपको अपने डैशबोर्ड के धीमे लोडिंग सेक्शन (शायद कैशिंग, इंडेक्सिंग इत्यादि) को अनुकूलित करके भविष्य में अपना डिज़ाइन बढ़ाने में मदद मिलेगी।

आपके डीएओ कॉल को घुमाने से केवल डेटा संरचना जटिल और इकाई परीक्षण कठिन हो जाएगा।

+1

धन्यवाद। दुर्भाग्य से मैं आपको पूर्ण बक्षीस देने में बहुत देर हो चुकी थी। –

3

आम तौर पर समानांतर में क्वेरी निष्पादित करने के लिए यह बहुत तेज होगा। यदि आप स्प्रिंग डेटा का उपयोग कर रहे हैं और अपने जेपीए प्रदाता (हाइबरनेट) को विशिष्ट कनेक्शन कॉन्फ़िगर नहीं करते हैं तो एक कनेक्शन पूल बनाएगा जो आपके डेटा बेस से कनेक्शन स्टोर करता है। मुझे लगता है कि डिफ़ॉल्ट रूप से हाइबरनेट में 10 कनेक्शन होते हैं और ऐसा करके यह समानांतर में 10 प्रश्न करने के लिए तैयार होता है। समानांतर में चलकर क्वेरी कितनी तेजी से होती हैं डेटाबेस और टेबल/क्वेरी की संरचना पर निर्भर करती है। मुझे लगता है कि @Async का उपयोग करना यहां सबसे अच्छा अभ्यास नहीं है। 20 आरईएसटी एंडपॉइंट्स को परिभाषित करना जो एक विशिष्ट क्वेरी का परिणाम प्रदान करता है, एक बेहतर तरीका है। ऐसा करके आप प्रत्येक क्वेरी के लिए इकाई, रिपोजिटरी और RestEndpoint कक्षा को सरल बना सकते हैं। ऐसा करके प्रत्येक क्वेरी अलग है और कोड कम जटिल है।

संबंधित मुद्दे