2010-12-28 12 views
24

ठीक है, मैंने लेखों/उदाहरणों का समूह पढ़ा है कि सिंगलटन में एंटीटी मैनेजर फैक्ट्री कैसे लिखें।EntityManagerFactory उदाहरण कब बनाया/खोला जाना चाहिए?

उनमें से मेरे लिए सबसे आसान एक थोड़ा समझने के लिए:

http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html

मुझे पता चला कि EntityManagerFactory (ईएमएफ) केवल आवेदन दायरे में एक बार बेहतर बनाया जाना चाहिए। (?):

public class EmProvider { 

    private static final String DB_PU = "KogaAlphaPU"; 

    public static final boolean DEBUG = true; 

    private static final EmProvider singleton = new EmProvider(); 

    private EntityManagerFactory emf; 

    private EmProvider() {} 

    public static EmProvider getInstance() { 
     return singleton; 
    } 


    public EntityManagerFactory getEntityManagerFactory() { 
     if(emf == null) { 
      emf = Persistence.createEntityManagerFactory(DB_PU); 
     } 
     if(DEBUG) { 
      System.out.println("factory created on: " + new Date()); 
     } 
     return emf; 
    } 

    public void closeEmf() { 
     if(emf.isOpen() || emf != null) { 
      emf.close(); 
     } 
     emf = null; 
     if(DEBUG) { 
      System.out.println("EMF closed at: " + new Date()); 
     } 
    } 

}//end class 

और मेरे विधि EmProvider का उपयोग कर:

और यह भी एक बार यह प्रयोग किया जाता है ईएमएफ बंद करने के लिए सुनिश्चित करें कि

तो मैं EMF सहायक वर्ग व्यापार के तरीकों का उपयोग करने के लिए लिखा था

public String foo() { 
    EntityManager em = null; 
    List<Object[]> out = null; 
    try { 

     em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); 
     Query query = em.createNativeQuery(JPQL_JOIN); //just some random query 
     out = query.getResultList(); 
    } 
    catch(Exception e) { 
     //handle error.... 
    } 
    finally { 
     if(em != null) { 
      em.close(); //make sure to close EntityManager 
     } 
     //should I not close the EMF itself here????? 
     EmProvider.getInstance().closeEmf(); 
    } 

मैंने विधि स्तर के भीतर EntityManager (em) को बंद करने के लिए सुनिश्चित किया है। लेकिन जब EntityManagerFactory को बंद किया जाना चाहिए तो? और क्यों ईएमएफ को सिंगलटन इतना बुरा होना चाहिए ??? मैंने समवर्ती मुद्दों के बारे में पढ़ा लेकिन जैसा कि मुझे बहु-थ्रेड-व्याकरण नहीं मिला है, मैं वास्तव में इस विचार पर स्पष्ट नहीं हो सकता।

+1

"और क्यों ईएमएफ को सिंगलटन इतना बुरा होना चाहिए ???" यह कथन मुझे शायद एक और सवाल खोलना चाहिए .... –

उत्तर

51
  • EntityManagerFactory उदाहरण हेवीवेट ऑब्जेक्ट्स हैं। प्रत्येक कारखाना मेटाडेटा कैश, ऑब्जेक्ट स्टेट कैश, EntityManager पूल, कनेक्शन पूल और बहुत कुछ बनाए रख सकता है। यदि आपके एप्लिकेशन को अब EntityManagerFactory की आवश्यकता नहीं है, तो आपको इन संसाधनों को मुक्त करने के लिए बंद करना चाहिए।

  • जब एक EntityManagerFactory बंद कर देता है, कि कारखाने, से और सभी इकाइयों विस्तार के द्वारा सभी EntityManagers उन EntityManagers द्वारा में कामयाब रहे, अमान्य हो।

  • यह बार-बार करने के लिए से समय की एक लंबी अवधि के लिए खुला एक कारखाने रखने बना सकते हैं और नए कारखानों को बंद करने में काफी बेहतर है। इस प्रकार, अधिकांश अनुप्रयोग फ़ैक्टरी को कभी भी बंद नहीं करेंगे, या केवल एप्लिकेशन को बाहर निकलने पर बंद कर देगा।

  • केवल अनुप्रयोगों है कि विभिन्न विन्यास के साथ कई कारखानों की आवश्यकता होती है एक स्पष्ट कारण बनाने के लिए और करीब कई EntityManagerFactory उदाहरणों की है।

  • केवल एक EntityManagerFactory प्रत्येक तैनात हठ इकाई विन्यास के लिए बनाया जा करने की अनुमति दी है। किसी भी संख्या में दिए गए कारखाने से बनाए गए EntityManager उदाहरण हो सकते हैं।

  • एक से अधिक इकाई प्रबंधक कारखाने उदाहरण JVM में एक साथ उपलब्ध हो सकता है।EntityManagerFactory इंटरफ़ेस के तरीके थ्रेडसेफ हैं।
+3

मुझे लगता है कि 'EntityManagerFactory' को ऑनलाइन वेब एप्लिकेशन के लिए बंद नहीं किया जाना चाहिए। – abbas

+1

इसे बंद किया जाना चाहिए, लेकिन केवल जब वेब एप्लिकेशन बंद हो जाता है (उपयोगकर्ता इसे रोकता है या इसे पूर्ववत करता है)। उदाहरण: JSF – GabrielBB

+1

@ pvm14 का उपयोग करते समय ServletContextListener इंटरफ़ेस से संदर्भ हटाया गया विधि हां, निश्चित रूप से। अगर आपको अपने रास्ते से जाना है और यदि वहां सबकुछ दस्तावेज में है और हर कोई समझता है, तो स्टैकओवरलो तस्वीर में नहीं आया होता। लोगों ने अनावश्यक रूप से मतदान नहीं किया है। यदि आप पसंद नहीं करते हैं, तो इसे छोड़ दें, अप्रासंगिक टिप्पणियां पोस्ट करने से बचें, इसके बजाय यदि आप कर सकते हैं, तो अधिक जानकारी, विवरण, गलतियों आदि को जोड़ने का प्रयास करें, जो हर किसी की मदद करेगा। –

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