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();
}
}
}
इस तरह के एक विस्तृत जवाब के लिए धन्यवाद। – Veera
एक मुद्दा: एक खोज/प्रतिस्थापित करें और 'persistAnce' की सभी घटनाओं को 'persistEnce' में बदलें और आप बहुत खुश रहेंगे। :-) – TOB
मुझे पता चला कि यह दृष्टिकोण Google ऐप इंजन पर काम नहीं करता है - किसी भी कारण से यह स्थानीयहोस्ट पर पूरी तरह से काम करता है लेकिन उत्पादन में अप्रत्याशित समय पर pmf बंद हो जाता है – bsautner