ConcurrentAccessException के बारे में कुछ और विवरण: ईजेबी स्पेक के अनुसार, एसएलएसबी तक पहुंच ऐप द्वारा सिंक्रनाइज़ की जाती है। सर्वर। हालांकि, यह एसएफएसबी के साथ मामला नहीं है। यह सुनिश्चित करने का बोझ है कि एसएफएसबी को समवर्ती रूप से एक्सेस नहीं किया गया है, एप्लिकेशन डेवलपर के कंधों पर है।
क्यों? खैर, एसएलएसबी का सिंक्रनाइज़ेशन केवल आवृत्ति-स्तर पर आवश्यक है। यही है, एसएलएसबी का प्रत्येक विशेष उदाहरण सिंक्रनाइज़ किया गया है, लेकिन आपके पास पूल में या क्लस्टर में विभिन्न नोड पर कई उदाहरण हो सकते हैं, और विभिन्न उदाहरणों पर समवर्ती अनुरोध कोई समस्या नहीं है।यह दुर्भाग्य से एसएफएसबी के साथ इतना आसान नहीं है क्योंकि क्लस्टर में उदाहरणों और प्रतिकृति के निष्क्रियता/सक्रियण की वजह से। यही कारण है कि कल्पना इस पर लागू नहीं होती है। यदि आप इस विषय में रूचि रखते हैं तो this dicussion पर एक नज़र डालें।
इसका मतलब है कि सर्वलेट से एसएफएसबी का उपयोग करना जटिल है। एक ही सत्र से कई खिड़कियों वाले उपयोगकर्ता, या रेंडरिंग समाप्त होने से पहले पृष्ठ को पुनः लोड करने से समवर्ती पहुंच हो सकती है। सर्वलेट में किए गए ईजेबी की प्रत्येक पहुंच सैद्धांतिक रूप से बीन पर सिंक्रनाइज़ करने की आवश्यकता होती है। क्या मैंने किया था विशेष EJB उदाहरण पर सभी आमंत्रण सिंक्रनाइज़ करने के लिए एक InvocationHandler बनाने के लिए किया गया था: तब
public class SynchronizationHandler implements InvocationHandler {
private Object target; // the EJB
public SynchronizationHandler(Object bean)
{
target = bean;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
synchronized(target)
{
// invoke method to the target EJB
}
}
}
, सही होने के बाद आप EJB के लिए दूरदराज के संदर्भ प्राप्त है, आप इसे SynchronizationHandler
के साथ रैप । इस तरह आप सुनिश्चित हैं कि इस विशेष उदाहरण को आपके ऐप से समवर्ती रूप से एक्सेस नहीं किया जाएगा (जब तक यह केवल एक JVM में चलता है)। आप एक नियमित रैपर वर्ग भी लिख सकते हैं जो बीन के सभी तरीकों को सिंक्रनाइज़ करता है।
मेरा निष्कर्ष फिर भी है: जब भी संभव हो एसएलएसबी का उपयोग करें।
संपादित:
इस उत्तर EJB 3.0 चश्मा को दर्शाता है (अनुभाग 4.3.13):
ग्राहकों स्टेटफुल सत्र के लिए समवर्ती कॉल वस्तु बनाने के लिए अनुमति नहीं है। यदि उदाहरण पर क्लाइंट-चालान व्यवसाय विधि प्रगति पर है, तो एक और क्लाइंट-आह्वान कॉल, एक ही या अलग क्लाइंट से, एक राज्य सत्र सत्र बीन क्लास, के उसी उदाहरण पर आता है यदि दूसरा क्लाइंट क्लाइंट है सेम के व्यापार इंटरफेस, समवर्ती मंगलाचरण javax.ejb.ConcurrentAccessException
इस तरह के प्रतिबंध EJB 3.1 में हटा दिया गया है (खंड 4.3.13) प्राप्त दूसरा ग्राहक में हो सकता है:
डिफ़ॉल्ट रूप से, ग्राहकों को बनाने की अनुमति है समसामयिक सत्र ऑब्जेक्ट के समवर्ती कॉल और कंटेनर को समवर्ती अनुरोधों को क्रमबद्ध करने की आवश्यकता है।
[...]
बीन डेवलपर वैकल्पिक रूप से निर्दिष्ट कर सकता है कि समवर्ती ग्राहक स्टेटफुल सत्र सेम को अनुरोध निषिद्ध हैं। यह @AccessTimeout एनोटेशन या एक्सेस-टाइमआउट परिनियोजन डिस्क्रिप्टर तत्व 0 के मान के साथ प्रयोग किया जाता है। इस मामले में, यदि क्लाइंट द्वारा लागू व्यवसाय विधि किसी उदाहरण पर प्रगति पर है, तो जब कोई अन्य क्लाइंट-आह्वान कॉल, से एक ही या अलग क्लाइंट, राज्य सत्र सत्र बीन के उसी उदाहरण पर आता है, यदि दूसरा क्लाइंट बीन के व्यावसायिक इंटरफ़ेस या नो-इंटरफ़ेस व्यू का क्लाइंट है, समवर्ती आमंत्रण का परिणाम दूसरे क्लाइंट को प्राप्त करना होगा javax.ejb।ConcurrentAccessException
AFAIK, एक ऐपसेवर पर डेटासॉर्स बनाते समय आपको हाथ से पहले पता होना चाहिए कि डेटाबेस मौजूद है। उपरोक्त कनेक्शन डेटाबेस में बनाया गया है जिसे उपयोगकर्ता निर्दिष्ट करता है जिसे हमें कनेक्ट करना होगा। – Burmudar
यह मेरे लिए बहुत असुरक्षित लगता है। – duffymo