2010-11-19 19 views
25

मेरे पास EntityManagerFactory है जिसके लिए मैं एक (या एकाधिक) EntityManager उदाहरण बना सकता हूं। मैं एक सर्वलेट वातावरण का उपयोग कर रहा हूं, और मेरे पास एक EntityManagerFactory है जो सर्वलेट (सर्वलेट संदर्भ के माध्यम से) तक पहुंचा है जो सर्वलेट के जीवनकाल (और इसलिए, सभी उपयोगकर्ताओं के लिए) के लिए साझा किया जाता है।मुझे एंटिटी मैनेजर कितनी बार बनाना चाहिए?

मैं निम्न में से एक कर सकते हैं:

  • मेरी सर्वलेट के जीवनकाल (जैसे सभी उपयोगकर्ताओं के बीच साझा)
  • प्रति उपयोगकर्ता एक बनाएं (ताकि प्रत्येक उपयोगकर्ता में अपने स्वयं के हो जाता है के लिए एक एकल EntityManager बनाएं HttpSession)
  • HTTP अनुरोध (प्रति एक बनाएं कहते हैं, एक नया एक instantiating और एक doGet विधि के अंत)

कौन सा सबसे उपयुक्त है पर यह बंद करके? EntityManager को महत्वपूर्ण बनाने की लागत क्या है? यदि मैं एक साझा साझा इकाई प्रबंधक करता हूं, तो क्या एक लेनदेन का दायरा है (यानी स्वतंत्र उपयोगकर्ताओं के बीच अपडेट दूसरों को बदल सकता है)?

उत्तर

24

पूरे सर्वलेट के लिए एक ईएम अच्छा नहीं लगता है। यदि आप कंटेनर-प्रबंधित ईएम (उदाहरण के लिए ईजेबी 3) का उपयोग नहीं कर रहे हैं तो पुनर्मूल्यांकन particular unit of work के लिए ईएम का उपयोग करना है।

वेब अनुप्रयोग संदर्भ में आपका तीसरा सुझाव (एक प्रति HTTP अनुरोध) अच्छा लगता है। हालांकि इससे आपको एक गड़बड़ी हो सकती है जहां आप अपनी डीबी परत के साथ अपनी सेवा परत बांध रहे हैं (आपकी सेवा परत को ईएम के अस्तित्व के बारे में भी पता नहीं होना चाहिए)।

एक और दृष्टिकोण प्रोग्रामिंग रूप से आपके डीएओ में लेनदेन को कम करने और प्रत्येक विधि कॉल के लिए अपने डीएओ को एक नए ईएम का उपयोग करने के लिए प्राप्त करना होगा।

संपादित करें: ईएम ईएमएफ के विपरीत बनाने के लिए सस्ते हैं जिनके पास महत्वपूर्ण ओवरहेड है। एक ईएमएफ का उपयोग करना (जो ऐसा लगता है कि आप करते हैं) और बहुत से ईएम जाने का रास्ता है।

+0

सहमत हुए। मैं पूरी तरह से सुझाव देता हूं कि आप ईजेबी 3 या स्प्रिंग फ्रेमवर्क जैसे एकीकरण फ्रेमवर्क का उपयोग करें जो EntityManager प्रबंधन का बोझ उठाएगा। –

1

हम प्रत्येक slsb के लिए एक इंजेक्शन इकाई प्रबंधक करते हैं, - और एसएलएसबी स्वयं को एक प्रतिनिधि के माध्यम से एक्सेस किया जाता है, जिसमें से एक सत्र होता है, जो स्थानीय/दूरस्थ इंटरफ़ेस को देखता है। Ejb3.0 का उपयोग करना।

+0

प्रति सत्र एक स्टेटलेस बीन कैसे हो सकता है? स्टेटलेस बीन्स परिभाषा के अनुसार सत्रों से बंधे नहीं हैं। –

+0

@ फिलिप जार्डस संपादित। स्टेटलेस बीन्स को वार्तालाप वाले राज्य/डेटा को संग्रहीत नहीं किया जाता है जो धारावाहिक है। इसलिए प्रत्येक सत्र के लिए एक एसएलएसबी का एक उदाहरण बनाने के लिए यह पूरी तरह से मान्य है। यह मेरी समझ है कि उनके पास एसएफएसबी की तुलना में बहुत कम ओवरहेड है। – NimChimpsky

+0

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

0

हां, मैं डीबी तक पहुंचने और काम की एक इकाई प्रति ईएम का उपयोग करने के लिए ईजेबी 3.एक्स का उपयोग करने के लिए निम चिम्पस्की और क्वर्वकी से सहमत हूं।

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