जब भी मैं किसी भी इकाई को जारी रखना चाहता हूं तो निम्नलिखित कोड निष्पादित हो जाता है। चीजें ठीक काम कर रही हैं लेकिन मुझे यह समझने में असफल रहा कि यह कैसे काम करता है!जेपीए लेनदेन कैसे काम करता है
EntityManager em = getEntityManager();
EntityTransaction userTransaction = em.getTransaction();
userTransaction.begin();
em.persist(ent);
userTransaction.commit();
उपरोक्त EntityManager पूरे एप्लिकेशन द्वारा साझा किया गया एक उदाहरण है। लेनदेन शुरू करने के बाद; मैं सिर्फ em.persist (इकाई) कहता हूं .. हाइबरनेट कैसे जानता है कि यह किस लेनदेन से संबंधित है!
मान लीजिए कि मेरे आवेदन पर 10 समवर्ती उपयोगकर्ता हैं और उपरोक्त कोड निष्पादित सभी 10 धागे हैं। तो 10 स्वतंत्र लेनदेन बनाए और प्रतिबद्ध किए जा रहे हैं। लेकिन सभी 10 अलग-अलग संस्थाएं मैं उन्हें अपने संबंधित लेनदेन से जोड़ नहीं रहा हूं; तो जेपीए इसे कैसे काम करने में सक्षम है!
उत्तरों के आधार पर; हमारे पास नीचे है; क्या हम कह रहे हैं कि हमारे पास प्रति थ्रेड एंटिटी मैनेजर इंस्टेंस होना चाहिए? क्या यह सर्वर पर एक हत्या नहीं होगी! क्या हमें इन उदाहरणों को पूल करना चाहिए? क्या यह फिर से कनेक्शन पूलिंग को लागू करने के बराबर नहीं होगा?
आपका क्या मतलब है "कौन सा लेनदेन"? एक ईएम में किसी भी समय एक एकल (स्थानीय) लेनदेन होता है; इसमें एकाधिक नहीं है। एकाधिक धागे में एक एकल ईएम साझा करना समस्याओं के लिए एक नुस्खा है, क्योंकि यह थ्रेड-सुरक्षित होने की गारंटी नहीं है। – DataNucleus
http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html एक EntityManagerFactory एक महंगी-टू-बिल्ड, थ्रेडसेफ ऑब्जेक्ट है जो सभी एप्लिकेशन थ्रेड द्वारा साझा किया जाना है। यह आमतौर पर एप्लिकेशन स्टार्टअप पर एक बार बनाया जाता है। एक EntityManager एक सस्ती, गैर-थ्रेडसेफ ऑब्जेक्ट है जिसे एक ही व्यवसाय प्रक्रिया के लिए, काम की एक इकाई के लिए, और फिर – Deepak
को छोड़कर आगे पढ़ने पर उपयोग किया जाना चाहिए; मैं समझता हूं कि EntityManager का निर्माण हल्का वजन है लेकिन अभी भी बहुत हल्का वजन नहीं है कि प्रत्येक छोटे डीबी ऑपरेशन के लिए हम इसे बनाते हैं। सुझाए गए समाधान ईएम प्रति अनुरोध बनाने के लिए है। तो, ऐसा लगता है कि यह थ्रेडलोकल स्तर पर होना चाहिए। – Deepak