2012-02-24 11 views
23

द्वारा तारों अपने प्रोजेक्ट में से परिमाण से धीमी है, मैं मेंस्प्रिंग तारों नाम

Foo foo = beanFactory.getBean(Foo.class); 

लाभ स्पष्ट हैं

Foo foo = (Foo) beanFactory.getBean("name"); 

के सभी उपयोगों के विस्थापित करने के लिए कोशिश कर रहा हूँ: प्रकार की सुरक्षा, कम संकुचित कोड, कम बेकार स्थिरांक, आदि। आमतौर पर ऐसी रेखाएं स्थिर विरासत संदर्भों में स्थित होती हैं जहां ऐसी तारों का एकमात्र विकल्प होता है।

यह तब तक ठीक था जब तक कि एक दिन के उपयोगकर्ताओं ने स्प्रिंग इंटर्नल्स से आने वाली धीमी गति के बारे में शिकायत करना शुरू नहीं किया। इसलिए मैं

org.springframework.beans.factory.support.AbstractBeanFactory::doGetBean(String, Class<T>, Object[], boolean)

जो

Class.isAssignableFrom(anotherClass) को एक महंगी कॉल है में एक गर्म स्थान खोजने के लिए एक प्रोफाइलर ऊपर निकाल दिया।

मैं जल्दी से एक छोटा सा प्रदर्शन परीक्षण बनाया है स्ट्रिंग नाम और प्रकार लुकअप के बीच गति अंतर पता लगाने के लिए एक काली है बार (मैं इस परीक्षण FAIW के लिए StaticApplicationContext उपयोग कर रहा हूँ)!

इसकी जांच करते समय, मुझे SPR-6870 मिला जिसमें उच्च संख्या में वोट हैं लेकिन किसी कारण से संबोधित नहीं किया गया है। इससे मुझे an attempt to solve this problem का नेतृत्व हुआ जो स्थिति में काफी सुधार करता है लेकिन स्ट्रिंग द्वारा लुकअप के मुकाबले ~ 25 बार धीमा है! यह पता चला है कि यह प्रयास केवल समस्या का आधा हल करता है: यह ओ (एन) पुनरावृत्ति पर सहेजने के लिए बीन के नाम को कैश करता है लेकिन फिर भी प्रकार को सत्यापित करने के लिए isAssignableFrom पर कॉल करना पड़ता है।

वर्णित समस्या न केवल मेरे परिदृश्य से संबंधित है बल्कि @Autowired का उपयोग करने वाले बीन्स के लिए भी है और उन मामलों में कठिन महसूस किया जा सकता है जहां एक लूप के अंदर सेम बनाए जाते हैं।

समाधानों में से एक समाधान बीन फैक्ट्री विधियों में से एक को ओवरराइड करना होगा और यह-बीन-द-द-द-टाइप प्रकार के परिणामों को कैश करना होगा, लेकिन स्पष्ट रूप से यह वसंत में किया जाना चाहिए, न कि मेरे कोड में।

क्या कोई और इसी तरह की समस्या से पीड़ित है और इसे हल कर रहा है?

+0

तो, आप टाइप करके ऑटोवायर करना चाहते हैं, लेकिन बिना किसी प्रकार की जांच किए? – GreyBeardedGeek

+0

मैं महंगी प्रकार की जांच से बचने के लिए एक ही प्रकार के खिलाफ दूसरी कॉल चाहता हूं। या कम से कम मैं यह निर्दिष्ट करने की क्षमता चाहता हूं कि यह सक्षम या अक्षम है या नहीं। ऑब्जेक्ट सृजन ऐसी मूल बात है कि इस तरह के छोटे अनुकूलन एक बड़ा अंतर बना सकते हैं। – mindas

उत्तर

2

अधिकांश स्प्रिंग ऐप्स रनटाइम पर संदर्भ से सेम को पकड़ने के बजाए स्टार्टअप पर चीजों को एकसाथ तार करते हैं। फिर भी, जब तक कि आप अपने ऐप के नियमित संचालन के दौरान अपना आवेदन संदर्भ बदल नहीं रहे हैं, आपको कभी भी एक से अधिक बार बीन नहीं लेना चाहिए।

यह देखते हुए कि, यदि आपके उपयोगकर्ता धीमेपन की शिकायत कर रहे हैं, तो ऐसा लगता है कि आपकी वास्तविक समस्या बहुत अधिक बीन लुकअप है; ऐसा करने के धीमे साधनों के आपके उपयोग ने वास्तविक समस्या को सामने लाया है।

मैं (जावा में अपनी निर्भरता कॉन्फ़िगर, स्प्रिंग 3.0 में समर्थित मेरा मानना ​​है कि) जावा कॉन्फ़िग में जाने और स्टार्टअप पर सभी सेम तार की अपने अनुप्रयोग को विन्यस्त की कोशिश करेंगे। इसका लाभ यह भी है कि निर्भरता को पूरा नहीं किया जा सकता है, तो आपका ऐप अभी शुरू नहीं होगा।

+0

मुझे लगता है कि आप वास्तव में क्या कहना चाहते हैं "मेरी समस्या यह है कि मैं इसके लिए वसंत का उपयोग कर रहा हूं" :) जावा कॉन्फ़िगर के बारे में - हाँ, यह एक बचने का विकल्प है, लेकिन मुझे अभी भी लगता है कि मूल समस्या को संबोधित किया जाना चाहिए जैसा कि प्रतीत होता है अन्य वसंत उपयोगकर्ताओं के बहुत से प्रभावित (अपवर्त गिनती से निर्णय)। – mindas

+0

मुझे कभी भी इस समस्या को वसंत के साथ नहीं मिला और कुछ सुंदर परियोजनाओं पर इसका इस्तेमाल किया। ऐप स्टार्टअप समय काफी धीमा था, लेकिन एक बार चीजें वायर्ड हो जाने के बाद, यह ठीक काम करता था। हम आम तौर पर नाम से स्वामित्व में थे, लेकिन कुछ एक्सएमएल विन्यास भी थे। हमने कभी भी GetBean को कभी नहीं बुलाया। – davetron5000

+0

"बड़ी परियोजनाओं" में विभिन्न परिदृश्य हो सकते हैं। आपका तर्क है कि आपको कभी भी यह समस्या नहीं थी। इसके अलावा, मुझे सुझाव है कि जावा कॉन्फ़िगर (उदाहरण के लिए एक्सएमएल के बजाय) का उपयोग करने से किसी भी तरह से मदद मिलेगी - यदि उसी प्रकार के बीनफैक्टरी का उपयोग किया जाता है, तो यह एक ही समस्या से ग्रस्त होगा। यह कारखाना बीन तत्काल कार्यान्वयन है जो टूट गया है, न कि असेंबली। – mindas

5

यह समस्या अब SPR-6870 के संकल्प के साथ वसंत में हल किया जाता है। विवरण के लिए संकल्प टिप्पणियां देखें। फिक्स संस्करण 3.2.0.RELEASE और 3.1.2 के रूप में उपलब्ध है।

+1

हम वसंत 3.2.1 का उपयोग कर रहे हैं लेकिन फिर भी स्टार्ट अप के दौरान आवेदन द्वारा खर्च किए गए अधिकांश समय प्रकार से स्वत: काम कर रहे हैं। कोई सुझाव? –