2010-02-11 10 views
8

मैं जेपीए/ओपनजेपीए में नया हूं और मैंने देखा कि यदि मैं संस्थाओं को कायम रखने के बाद EntityManager.clear() पर कॉल नहीं करता हूं तो मुझे OutOfMemoryError (मैं एक लूप में नई इकाइयां जोड़ता हूं) प्राप्त करता हूं। मुझे यकीन नहीं है कि यह अपेक्षित व्यवहार है या यह सिर्फ और ओपनजेपीए 1.2.1 गड़बड़ है।क्या मुझे स्मृति लीक से बचने के लिए अक्सर EntityManager.clear() को कॉल करना है?

तो, क्या मुझे स्पष्ट रूप से संस्थाओं को अलग करने की आवश्यकता है? यदि मैं नहीं हूं, तो यह एक अच्छा अभ्यास है वैसे भी?

उत्तर

6

मुझे जेपीए के साथ ज्यादा अनुभव नहीं है। हालांकि यह उपयोगी होगा -
जेपीए में आपको या तो
- प्रत्येक लेनदेन के लिए एक नया EntityManager बनाएं।
- दृढ़ता संदर्भ को साफ़ करने के लिए प्रत्येक लेनदेन के बाद स्पष्ट() पर कॉल करें।

+0

धन्यवाद। ठीक है, उत्तरों में संकेतों के साथ मुझे पता चला कि मुझे आवेदन में केवल एक लंबे समय तक रहने वाले EntityManager का उपयोग नहीं करना चाहिए। मुझे विधि के दायरे का उपयोग करना चाहिए या दायरे का अनुरोध करना चाहिए [1]। इससे em.clear() को कॉल करने की आवश्यकता को हटा दिया जाएगा। धन्यवाद! [1] http://javanotepad.blogspot.com/2007/08/managing-jpa-entitymanager-lifecycle.html – ecerulm

+0

उपयोगी लिंक। मैंने निर्भरता इंजेक्शन (सीम का उपयोग करके) के साथ जेपीए का इस्तेमाल किया था, इसलिए इसी तरह के मुद्दे का सामना नहीं किया था। – Padmarag

5

निर्भर करता है कि आप दृढ़ता प्रक्रिया (पढ़ने) में कितनी वस्तुओं को लाते हैं। यदि आप बड़ी संख्याओं को संभालते हैं (या कुछ वस्तुएं बड़ी हैं) तो स्पष्ट() का उपयोग समझ में आता है। प्रत्येक बार जब कोई ऑब्जेक्ट पढ़ा जाता है तो इसे जेपीए इम्प्ले द्वारा एल 1 कैश में रखा जाना चाहिए।

3

ऐसा लगता है कि आपके डिजाइन में कहीं कुछ गड़बड़ है। आम तौर पर, इकाई प्रबंधक के दायरे से बाहर होने के बाद इकाई अलग हो जाती है। और यह एक कारण है कि आप दायरे के बाहर संबंधों को आलसी लोड नहीं कर सकते हैं।

जहां तक ​​मेरा अनुभव चिंतित है, मैं कभी-कभी em.clear(), कभी भी इस्तेमाल नहीं करता था। मैंने हाइबरनेट कार्यान्वयन और टॉपलिंक अनिवार्यता का उपयोग किया। ओपनजेपीए के साथ अभी तक कोई अनुभव नहीं है।

+0

जब आप कहते हैं कि इकाई अलग हो जाती है तो यह इकाई प्रबंधक के दायरे से बाहर है क्या आपका मतलब है कि मुझे EntityManager को बंद करना चाहिए और प्रत्येक लेनदेन के लिए पद्मराग सुझाव देना चाहिए? – ecerulm

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