2009-02-09 16 views
5

के माध्यम से अभिलेखों के बैच हटाने/शुद्ध करने के अधिकार - मैं डेटाबेस से 1,000,000 रिकॉर्ड (उदा।) को हटाना चाहता हूं। इसमें काफी समय लगता है -> लेन-देन का समय समाप्त हो जाता है और विफल रहता है। तो - मैं उन्हें बैच में हटा देता हूं, प्रति लेनदेन 25000 रिकॉर्ड कहते हैं। ओरेकल पर MySQL या ROWNUM पर सीमा खंड का उपयोग करना। ग्रेट यह काम करता है।जावा ओआरएम

मैं इसे डेटाबेस में स्वतंत्र तरीके से करना चाहता हूं। और जेपीए/हाइबरनेट का उपयोग करने वाले मौजूदा जावा कोड बेस से।

भाग्य से बाहर। जेपीए Query.setMaxResults और setFirstResult के पास 'प्रश्न' लिखने के लिए प्रभाव नहीं है (उदा। हटाएं)। कई इकाइयों को चुनकर उन्हें व्यक्तिगत रूप से हटाने के लिए स्मृति में बहुत धीमी और गूंगा है, मैं कहूंगा।

इसलिए मैं मूल क्वेरी का उपयोग करता हूं और एप्लिकेशन कोड में 'सीमा' खंड का प्रबंधन करता हूं। orm.xml में इस खंड को समाहित करना अच्छा होगा लेकिन ... "हाइबरनेट एनोटेशन 3.2 मूल प्रश्नों का उपयोग करके थोक अद्यतन/हटाए जाने का समर्थन नहीं करता है।" - http://opensource.atlassian.com/projects/hibernate/browse/ANN-469

मुझे लगता है कि यह एक आम समस्या है। किसी को भी बेहतर डेटाबेस स्वतंत्र समाधान मिला है?

उत्तर

0

प्रश्नों पर सीमाएं डेटाबेस विशिष्ट सुविधा है और कोई SQL मानक नहीं है (मैं सहमत हूं कि वहां होना चाहिए)।

एक समाधान जो अधिकांश डेटाबेस के साथ काम करता है, एक से कई तालिकाओं को समूहबद्ध करने के लिए एक दृश्य का उपयोग कर रहा है। प्रत्येक तालिका में डेटा का सबसेट होता है (एक दिन कहें)। यह आपको एक बार में एक संपूर्ण सबसेट छोड़ने की अनुमति देता है। उस ने कहा, कई डेटाबेस में ऐसे दृश्य पर अद्यतन और INSERT चलाने के साथ समस्याएं हैं।

आप आमतौर पर INSERT/UPDATE (जो एक ही तालिका को इंगित करता है; "वर्तमान" एक) और खोज के लिए समूहबद्ध दृश्य के लिए दृश्य या उपनाम बनाकर इसके आसपास काम कर सकता है।

कुछ डेटाबेस भी विभाजन की पेशकश करते हैं जो मूल रूप से वही बात है, सिवाय इसके कि आप एक कॉलम को परिभाषित कर सकते हैं जिसमें निर्दिष्ट किया गया है कि अंतर्निहित तालिका को पंक्ति में जाना चाहिए (INSERT पर)। जब आपको एक सबसेट हटाने की आवश्यकता होती है, तो आप अंतर्निहित तालिकाओं में से एक को छोड़/मिटा सकते हैं।

5

मुझे एक गैर रचनात्मक उत्तर देने से नफरत है लेकिन एक ओआरएम वास्तव में डेटाबेस पर थोक संचालन करने के लिए नहीं है। तो ऐसा लगता है कि मूल संचालन शायद इन परिचालनों के लिए सबसे अच्छी शर्त है।

आपको यह भी सुनिश्चित करना चाहिए कि डेटाबेस की नई स्थिति को दर्शाने के लिए आपका ORM अपडेट किया गया है अन्यथा आपको कुछ अजीबता हो सकती है।

ORM डेटाबेस पर ऑब्जेक्ट्स मैप करने के लिए बहुत अच्छे उपकरण हैं, लेकिन वे आम तौर पर जेनेरिक डेटाबेस इंटरफेस नहीं होते हैं।

0

मेरा मानना ​​है कि आप HQL (जेपीए QL) प्रत्यक्ष DML कार्रवाई जो हठ संदर्भ और कैश को बायपास करने का उपयोग कर सकते है, और सीधे (जिसके परिणामस्वरूप एसक्यूएल) स्टेटमेंट्स को निष्पादित:

Query q = session.createQuery("delete YourEntity ye where ye.something like :param"); 
q.setParameter("param", "anything"); 
int deletedEntities = q.executeUpdate(); 
+0

मुझे लगता है कि प्रश्न पूछने वाला यह पहले से ही कर रहा है, लेकिन यह पता लगाना कि डिलीट इतनी धीमी है कि यह समय समाप्त हो गया है। –

0

q.setMaxResults(int)

.. .sony

+0

ओपी ने पहले ही संकेत दिया है कि उन्होंने बिना किसी सफलता के इसे आजमाया: 'भाग्य से बाहर। जेपीए क्वेरीsetMaxResults और setFirstResult का 'प्रश्न' लिखने के लिए कोई प्रभाव नहीं है ... ' – Mac

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