2009-03-06 7 views
11

हम सभी जानते हैं कि वेब स्तरीय में संभावना है कि दिए गए सर्वलेट का केवल एक ही उदाहरण मौजूद है जो कई अनुरोधों को सेवाएं देता है। यह उदाहरण चर में थ्रेडिंग मुद्दों का कारण बन सकता है।क्या एक ईजेबी को एक सर्वलेट में एक आवृत्ति चर के रूप में इंजेक्ट करना सुरक्षित है?

मेरा सवाल यह है कि, क्या एक ईजेबी एनोटेशन को @EJB एनोटेशन का उपयोग एक सर्वलेट में एक आवृत्ति चर के रूप में इंजेक्ट करना सुरक्षित है?

मेरा प्रारंभिक वृत्ति इस धारणा के तहत नहीं होगा कि ईजेबी का एक ही उदाहरण एक ही समय में कई अनुरोधों की सेवा करेगा। ऐसा लगता है कि यह कई अन्य प्रोग्रामर की प्रवृत्ति भी होगी: Don't inject to servlets

हालांकि मैं गलत निष्कर्ष पर कूद गया हूं। स्पष्ट रूप से सर्वलेट में इंजेक्शन दिया गया है प्रॉक्सी है, हुड के तहत कंटेनर वास्तव में एक अलग उदाहरण के साथ प्रत्येक अनुरोध की सेवा करता है और थ्रेड सुरक्षा बनाए रखता है? चूंकि यह मंच सुझाएगा: Do inject to servlets

कई विवादित राय प्रतीत होती है। क्या सही है???

उत्तर

3

आपका संदर्भ "servlets में इंजेक्ट न करें" ejbs या @ejb एनोटेशन के बारे में कुछ भी नहीं बताता है। यह थ्रेड सुरक्षित ऑब्जेक्ट्स जैसे पर्सिस्टेंस कॉन्टेक्स्ट के बारे में बात नहीं करता है।

प्रति ईजेबी स्पेक आप सर्वलेट्स (ईजेबी 3.0 विशिष्टता (जेएसआर-220) - सेक्शन 3.1 सहित दूरस्थ ग्राहकों की विविधता से ejbs तक पहुंच सकते हैं। @EJB एनोटेशन का उपयोग करके ईजेबी इंजेक्शन करना निर्भरता इंजेक्शन (सेक्शन 3.4.1) के माध्यम से ईजेबी इंटरफ़ेस प्राप्त करने का एक तरीका है जो जेएनडीआई नेमस्पेस में ईजेबी ऑब्जेक्ट्स को देखने का विकल्प है। तो प्राप्त ईजेबी के संबंध में @EJB एनोटेशन के बारे में कुछ खास नहीं है।

तो, ईजेबी 3.0 स्पेक के आधार पर, यह @EJB एनोटेशन का उपयोग करके सर्वलेट से ejbs प्राप्त करने का एक मानक अभ्यास है।

+0

यह उत्तर सही है, जहां तक ​​यह जाता है, लेकिन यह ओपी की थ्रेड सुरक्षा चिंताओं को संबोधित नहीं करता है। मेरा मानना ​​है कि नीचे अनुमानित डिज़ाइन का जवाब सही होना चाहिए। –

+0

मुझे लगता है कि @ इंजेक्ट (सीडीआई, जेईई 6) के साथ इंजेक्शन वाला ईजेबी उतना ही सुरक्षित होगा, है ना? – marcus

0

मुझे लगता है कि सरल जवाब यह है कि आपको गारंटी नहीं है कि यह सुरक्षित है।

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

11

एक सर्वलेट में एक ईजेबी इंजेक्ट करना सुरक्षित है, जब तक कि ईजेबी स्टेटलेस नहीं है। आपको सर्वलेट में एक स्टेटफुल बीन इंजेक्ट नहीं करना चाहिए।

आप अपने EJB में है कि यह किसी भी उदाहरण चर जो अपने आप (हठ प्रसंग की तरह) स्टेटफुल मूल्य रखती है नहीं रखता है राज्यविहीन को लागू करना चाहिए। यदि आपको दृढ़ता संदर्भ का उपयोग करने की आवश्यकता है, तो आपको ईजेबी के तरीकों में इसका एक उदाहरण प्राप्त करना होगा। आप एक ईजेबी इंस्टेंस वैरिएबल के रूप में एक PersistenceContextFactory रखने के द्वारा ऐसा कर सकते हैं और फिर आपको ईजेबी की विधि में कारखाने से इकाई प्रबंधक का एक उदाहरण मिलता है।

PersistenceContextFactory थ्रेड-सुरक्षित है, इस प्रकार इसे एक आवृत्ति चर में इंजेक्शन दिया जा सकता है।

जब तक आप ऊपर उल्लेख किया नियमों के अनुपालन के रूप में, यह धागा सुरक्षित एक सर्वलेट

1

यह एक मिश्रित बैग है में एक स्टेटलेस बीन सुई होना चाहिए।

स्टेटलेस सत्र बीन्स इंजेक्शन और सुरक्षित हैं।ऐसा इसलिए है क्योंकि यहां तक ​​कि यदि स्टब का एक उदाहरण भी उपयोग किया जाता है, तो विधियों तक पहुंच को कंटेनर द्वारा क्रमबद्ध किया जाएगा।

मुझे लगता है कि inferreddesign क्या कहता है सही नहीं है। इससे कोई फर्क नहीं पड़ता कि स्टेटलेस सत्र बीन एक दृढ़ता संदर्भ का उपयोग करता है या नहीं। केवल एक कॉलर एक ही समय में एक ही बीन उदाहरण का उपयोग करेगा, भले ही दृढ़ता संदर्भ थ्रेड सुरक्षित न हो, फिर भी ईजेबी गार्ड इसके लिए कई पहुंच के खिलाफ है। इसके बारे में सोचें जैसे कि प्रत्येक सत्र बीन विधि में सिंक्रनाइज़ किए गए कीवर्ड पर लागू होता है।

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

+0

स्टब सिंक्रनाइज़ किया जाएगा, लेकिन मुझे उम्मीद है कि यह वास्तविक काम करने के लिए पूल किए गए ईजेबी में से एक को तुरंत भेज देगा। जब तक पूरे कॉल के दौरान स्टब लॉक रखता है, जो एक बहुत ही खराब कार्यान्वयन विकल्प होगा ... – marcus

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