2017-12-18 32 views
5

मेरे पास एक Grails सेवा है जो SQL सर्वर से बात करती है, जो 80,000 से अधिक रिकॉर्डों की थोक प्रसंस्करण (डेटाबेस से रिकॉर्ड अपडेट करना या नए रिकॉर्ड बनाना) करता है। हालांकि यह प्रक्रिया हो रही है, लेकिन उन रिकॉर्डों को इस प्रक्रिया से बंद कर दिया जा रहा है। अगर कोई और व्यक्तिगत रूप से रिकॉर्ड अपडेट करने का प्रयास कर रहा है, तो वह समय समाप्त हो गया है, उस रिकॉर्ड की प्रतीक्षा कर रहा है। थोक प्रसंस्करण के दौरान रिकॉर्ड कैसे क्वेरी और अद्यतन करें? इस तरह से यह अवरुद्ध नहीं होता है?ग्रेल्स थोक प्रसंस्करण तालिका पर ताला लगा रहा है

मैंने फ्लश का उपयोग करने का प्रयास किया है: सच है, लेकिन इससे मदद नहीं मिली।

उत्तर

4

flush=true आपके स्थानीय हाइबरनेट सत्र से डेटा को डेटाबेस में लिखता है, इसलिए आपके जैसे बड़े थोक संचालन के लिए आपके एप्लिकेशन सर्वर पर स्मृति समस्याओं से बचने के लिए महत्वपूर्ण है, लेकिन यह इस बात पर असर नहीं डालता कि डेटाबेस कैसे पंक्तियों को ताला लगाता है।

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

मध्य ग्राउंड के लिए, मैं एक हाइब्रिड दृष्टिकोण की अनुशंसा करता हूं, जहां आप अपनी सेवा static transactional=false होने के लिए सेट करते हैं, लेकिन फिर एक समय में एक निश्चित संख्या में पंक्तियों को करने के लिए .withTransaction {...} बंद करें और एक लूप का उपयोग करें।

यह एक पुराना लेख है लेकिन इसमें उपयोगी जानकारी है जो आपको पढ़नी चाहिए जो मैंने जो उल्लेख किया है उस पर कोड उदाहरण देता है। http://sacharya.com/transactions-in-grails/

+0

मेरे पास GORM MongoDB के साथ एक समान समस्या है। ऐसा लगता है कि गोरम मोंगोडीबी के लिए सत्र फैक्ट्री बीन मौजूद नहीं है। क्या आप जानते हैं कि GORM MongoDB के सत्र को कैसे फ़्लश करना और साफ़ करना है? – unekwu

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