2012-11-21 17 views
8

का उपयोग करने का प्रदर्शन प्रभाव मैं जावा ईई 6 वेब एप्लिकेशन लिख रहा हूं और ऑब्जेक्ट को सीधे बनाने और उपयोग करने के विरुद्ध इंजेक्शन ऑब्जेक्ट का उपयोग करते समय मैं एक महत्वपूर्ण प्रदर्शन प्रभाव देख रहा हूं। ओवरहेड 50-60 एमएमएस प्रति विधि कॉल के आदेश का प्रतीत होता है।सीडीआई

उदाहरण के लिए, गैर-इंजेक्शन 150 विधि कॉल का उपयोग लगभग 500 मिमी लेते हैं जबकि इंजेक्शन ऑब्जेक्ट का उपयोग करते हुए 150 विधि कॉल 12,000 - 13,000ms लेते हैं। परिमाण अंतर और फिर कुछ का एक आदेश।

क्या यह सामान्य है?

मैं जेबॉस एएस 7.1.1 फ़ाइनल पर चल रहा हूं जो सीडीआई को संभालने के लिए वेल्ड का उपयोग करता है।

इंजेक्शन ऑब्जेक्ट को सिंगलटन बीन (javax.ejb.Singleton एनोटेशन के माध्यम से) के रूप में परिभाषित किया जाता है। क्या यह समस्या का हिस्सा बन सकता है? या यह सिर्फ वेल्ड प्रॉक्सी धीमा होने के कारण है?

+0

यदि आप प्रदर्शन के बारे में अधिक परवाह करते हैं, तो आप जावा ईई का उपयोग करके * रास्ते * खराब हो जाते हैं। मुझे गंभीरता से संदेह है कि प्रॉक्सीड इंटरसेप्टर आपके कोड में बाधा बनने जा रहे हैं। उस ने कहा, मैं क्या करूँगा अवरोधक विधि कॉल के अंदर डीबगर में ब्रेकपॉइंट डालता है यह देखने के लिए कि प्रॉक्सी के कितने परतों को पार करना है - यह संभव है कि आपके पास कुछ कॉन्फ़िगरेशन समस्या हो जो उन्हें अत्यधिक मात्रा में लागू करने का कारण बनती है । – millimoose

+0

इंजेक्शन ऑब्जेक्ट को बदलने के बजाय @Singleton की बजाय अनुप्रयोगों को बढ़ाया गया है जो परिमाण के क्रम से चीजों को बढ़ा देता है। मुझे कोई जानकारी नहीं है कि अगर किसी के पास इस पर कोई प्रतिक्रिया है तो क्यों दिलचस्पी होगी। – Troup

+0

यह ... विषम है।कॉल चेन में अंतर क्या है, यह देखने के लिए मैं अभी भी डीबगर में इसे दबाऊंगा। अन्यथा हम एक अस्पष्ट लक्षण के कारण का अनुमान लगाने के लिए अटक गए हैं। आम तौर पर मेरा मानना ​​है कि इस ओवरहेड का कारण आपको * एओपी होना चाहिए, लेकिन यह किसी भी चीज़ से अधिक अनुमान है। – millimoose

उत्तर

9

उत्कृष्ट वेल्ड मंच से कुछ मदद के बाद मुझे पता चला है कि:

डिफ़ॉल्ट रूप से, सिंगलटन सत्र सेम व्यवहार (खंड 13.3.7 EJB 3.1 विनिर्देश के ) कर रहे हैं और एक विशेष के अधिग्रहण की आवश्यकता होती है प्रत्येक व्यावसायिक विधि आमंत्रण के लिए लॉक करें (अनुभाग 4.8.5.4 और 4.8.5.5)। इसके विपरीत, एक javax.inject.Singleton लेनदेन नहीं है और कंटेनर-प्रबंधित समरूपता का समर्थन नहीं करता है (प्रमुख परिणाम यह है कि कंटेनर द्वारा कोई लॉकिंग योजना लागू नहीं की गई है)।

आप @TransactionAttribute (NOT_SUPPORTED) और @Lock (पढ़ें) के साथ अपने सिंगलटन सत्र सेम व्याख्या हैं, तो आप काफी बेहतर प्रदर्शन देखना चाहिए, हालांकि अभी भी कुछ भूमि के ऊपर हो सकता है। यदि आपको ईजेबी फीचर्स की आवश्यकता नहीं है, तो @ एप्प्लिकेशनस्कोप्ड (javax.inject.Singleton को सीडीआई द्वारा परिभाषित नहीं किया गया है, और इसके अर्थशास्त्र इसलिए उस विनिर्देशन द्वारा शासित नहीं हैं) के साथ चिपके रहें।

https://community.jboss.org/thread/213684?tstart=0

दुर्भाग्य @TransactionAttribute (NOT_SUPPORTED) और @Lock (पढ़ें) के साथ मेरी EJB सिंगलटन व्याख्या के बाद भी प्रदर्शन अभी भी बहुत खराब थी (मूल पोस्ट से समय देखें)।

तो घर लेना संदेश ईजेबी सिंगलटन सत्र बीन्स इंजेक्ट नहीं करता है जब तक कि आपको पूरी तरह से प्रदर्शन करने वाले होने वाले प्रदर्शन ओवरहेड से अवगत न हो। उन विधियों के लिए जिन्हें शायद ही कभी बुलाया जाता है, यह नगण्य हो सकता है, लेकिन हमारे मामले में छोटे ओवरहेड तेजी से जमा होते हैं यदि यह भारी उपयोग की जाने वाली विधि है।

हमें ईजेबी सुविधाओं की आवश्यकता नहीं थी और इंजेक्शन बीन के माध्यम से बुलाए गए विशिष्ट विधि के प्रदर्शन में परिमाण सुधार के क्रम में अनुप्रयोग स्कोप्ड देखा गया।

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