2010-11-15 15 views
5

मेरे पास जेडीओ दृढ़ता प्रबंधक (पीएम, इसके बाद) बनाने/उपयोग करने के संबंध में दो प्रश्न हैं।जेडीओ दृढ़ता प्रबंधक का उपयोग कैसे करें?

कहो, एक जावा वेब अनुप्रयोग में, अगर मैं 10 संस्थाओं, जो तार्किक रूप से 2 समूहों में बांटा जा सकता है (उदाहरण के लिए, 5 उपयोगकर्ता संबंधित संस्थाओं और 5 व्यापार से संबंधित संस्थाओं)

  1. मैं की ज़रूरत है तो दो इन 2 समूहों या केवल एक पीएम का प्रबंधन करने के लिए अलग-अलग पीएम पर्याप्त हैं?
  2. प्रारंभिकरण के संबंध में, क्या मैं एक पीएम के सिंगलटन इंस्टेंस का उपयोग करूंगा (जिसे किसी उपयोगकर्ता द्वारा दिए गए समय पर ऐप का उपयोग करके साझा किया जाएगा) या क्या मुझे प्रत्येक सत्र के लिए पीएम बनाना चाहिए?

उत्तर

14

JDO Documentation के अनुसार आप एक PersistenceManagerFactory प्रति डेटास्टोर बनाते हैं। यदि आप SQL के माध्यम से डेटाबेस तक पहुंचने के लिए जेडीओ का उपयोग कर रहे हैं और आपके पास एक से अधिक डेटाबेस हैं, तो आपको PersistenceManagerFactory प्रति डेटाबेस की आवश्यकता होगी (क्योंकि जब आप PersistenceManagerFactory बनाते हैं तो आपको जेडीबीसी यूआरएल, उपयोगकर्ता नाम और पासवर्ड निर्दिष्ट करने की आवश्यकता होती है)।

सरल उपयोग के मामलों के लिए, आप केवल PersistenceManager बना सकते हैं जब आपको इसकी आवश्यकता हो और इसे finally खंड में बंद करें (the persistence manager documentation देखें)।

आप लेन-देन का उपयोग करें, और संस्थाओं अद्यतन करने के लिए कोड को कई तरीकों या वस्तुओं, मैं मांग पर PersistenceManager बनाने और ThreadLocal में भंडारण की सलाह देते हैं (या अनुरोध-दायरे वाले वस्तु अगर आप Guice या वसंत का उपयोग करें) में फैलाया जा सकता है, तो । यह सुनिश्चित करेगा कि अपडेट करने वाले किसी भी कोड वर्तमान लेनदेन में भाग लेता है। अनुरोध के अंत में PersistenceManager को बंद करना सुनिश्चित करें।

आप केवल एक हठ प्रबंधक कारखाने की जरूरत है, तो आप कर सकते हैं:

public class Datastore { 
    private static PersistenceManagerFactory PMF; 
    private static final ThreadLocal<PersistenceManager> PER_THREAD_PM 
     = new ThreadLocal<PersistenceManager>(); 

    public static void initialize() { 
    if (PMF != null) { 
     throw new IllegalStateException("initialize() already called"); 
    } 
    PMF = JDOHelper.getPersistenceManagerFactory("jdo.properties"); 
    } 

    public static PersistenceManager getPersistenceManager() { 
    PersistenceManager pm = PER_THREAD_PM.get(); 
    if (pm == null) { 
     pm = PMF.getPersistenceManager(); 
     PER_THREAD_PM.set(pm); 
    } 
    return pm; 
    } 

    public static void finishRequest() { 
    PersistenceManager pm = PER_THREAD_PM.get(); 
    if (pm != null) { 
     PER_THREAD_PM.remove(); 
     Transaction tx = pm.currentTransaction(); 
     if (tx.isActive()) { 
     tx.rollback(); 
     } 
     pm.close(); 
    } 
    } 
} 

किसी भी कोड है कि एक हठ प्रबंधक की जरूरत है कॉल कर सकते हैं Datastore.getPersistenceManager()

नोट: मैं सभी स्थैतिक तरीकों का इस्तेमाल किया इसके लिए सरल बनाने के लिए आपके प्रश्न का उत्तर देने के उद्देश्य। अगर मैं गुइस जैसे निर्भरता-इंजेक्शन ढांचे का उपयोग कर रहा था, तो मैं विधियों को गैर-स्थिर बना देता हूं और Datastore को सिंगलटन के रूप में बांधता हूं।

आप एक सर्वलेट फ़िल्टर में finishRequest कह सकते हैं:

public class PersistenceManagerFilter implements javax.servlet.Filter { 

    public init(FilterConfig filterConfig) { 
    Datastore.initialize(); 
    } 

    public void doFilter(ServletRequest request, 
     ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
    try { 
     chain.doFilter(request, response); 
    } finally { 
     Datastore.finishRequest(); 
    }  
    } 
} 
+0

इस तरह के एक विस्तृत जवाब के लिए धन्यवाद। – Veera

+0

एक मुद्दा: एक खोज/प्रतिस्थापित करें और 'persistAnce' की सभी घटनाओं को 'persistEnce' में बदलें और आप बहुत खुश रहेंगे। :-) – TOB

+0

मुझे पता चला कि यह दृष्टिकोण Google ऐप इंजन पर काम नहीं करता है - किसी भी कारण से यह स्थानीयहोस्ट पर पूरी तरह से काम करता है लेकिन उत्पादन में अप्रत्याशित समय पर pmf बंद हो जाता है – bsautner