2010-06-28 3 views
7

तो मेरे पास एक डेटाबेस है जहां जावा एप्लिकेशन से बहुत सारे डेटा डाले जा रहे हैं। सामान्य रूप से मैं तालिका 1 में सम्मिलित करता हूं, अंतिम आईडी प्राप्त करता है, फिर फिर तालिका 2 में डालें और वहां से अंतिम आईडी प्राप्त करें और अंत में तालिका 3 में डालें और उस आईडी को भी प्राप्त करें और एप्लिकेशन के साथ इसके साथ काम करें। और मैं हर 10-15 मिनट में डेटा की लगभग 1000-2000 पंक्तियां डालता हूं।बहुत छोटे आवेषणों में डेटाबेस में बहुत सारे डेटा डालें

और उत्पादन के वेबसर्वर पर बहुत से छोटे आवेषण और चयन का उपयोग करना वास्तव में अच्छा नहीं है, क्योंकि यह कभी-कभी सर्वर को दबा देता है।

मेरा प्रश्न है: क्या टेबल 1, टेबल 2, टेबल 3 में इतनी बड़ी संख्या में चयन और आवेषणों का उपयोग किए बिना एकाधिक डेटा डालने का तरीका है? क्या कोई एसक्यूएल-फ़ू तकनीक है जो मुझे याद आ रही है?

उत्तर

5

चूंकि आप शायद auto_increment प्राथमिक कुंजी पर भरोसा कर रहे हैं, तो आपको कम से कम तालिका 1 और तालिका 2 के लिए एक बार सम्मिलित करना होगा। क्योंकि MySQL आपको जेनरेट की गई अंतिम कुंजी से अधिक नहीं देगा।

आपको कभी भी चयन नहीं करना चाहिए। आप getGeneratedKeys() विधि का उपयोग कर स्टेटमेंट से अंतिम डाली गई आईडी प्राप्त कर सकते हैं। एक उदाहरण कनेक्टर/जम्मू के लिए MySQL के मैनुअल में यह दिखा:

http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-autoincrement-getgeneratedkeys

अन्य सिफारिशें:

  • उपयोग बहु पंक्ति table3 के लिए INSERT वाक्य रचना।
  • आयात करते समय ALTER TABLE DISABLE KEYS का उपयोग करें, और जब आप समाप्त कर लें तो उन्हें पुनः सक्षम करें।
  • स्पष्ट लेनदेन का उपयोग करें। अर्थात। अपने डेटा लोडिंग दिनचर्या से पहले एक लेनदेन शुरू करें, और अंत में प्रतिबद्ध करें। मैं शायद तालिका 1 की प्रत्येक 1000 पंक्तियों के बाद भी प्रतिबद्ध हूं।
  • तैयार बयान का उपयोग करें।

दुर्भाग्य से, आप, डेटा, LOAD DATA INFILE के थोक लोड के लिए सबसे तेजी से विधि का उपयोग नहीं कर सकते क्योंकि यह है कि आप प्रति पंक्ति उत्पन्न आईडी मूल्यों को प्राप्त करने के लिए अनुमति नहीं है।

2

यहाँ के बारे में बात करने के लिए एक बहुत कुछ है:

  1. यह संभावना है कि नेटवर्क विलंबता आप मार रहा है अगर उन आवेषण के प्रत्येक दूसरे नेटवर्क गोल यात्रा है। अपने अनुरोधों को बैच करने का प्रयास करें ताकि उन्हें पूरे लेनदेन के लिए केवल एक राउंडट्रिप की आवश्यकता हो।
  2. लेनदेन की बात करते हुए, आप उनका उल्लेख नहीं करते हैं। यदि उन तीनों आईएनएसईआरटी को काम की एक इकाई होने की आवश्यकता है तो आप बेहतर ढंग से लेनदेन को संभालना चाहते हैं। यदि आप नहीं जानते हैं, तो बेहतर शोध कैसे करें।
  3. यदि वे बहुत उपयोग कर रहे हैं तो कैशिंग अनुरोधों को आजमाएं। सबसे तेज़ राउंडट्रिप वह है जिसे आप नहीं बनाते हैं।
1

आप अपने डेटाबेस को फिर से डिजाइन कर सकते हैं जैसे प्राथमिक कुंजी डाटाबेस से उत्पन्न, स्वत: वृद्धि मूल्य नहीं बल्कि क्लाइंट उत्पन्न यूयूआईडी था। फिर आप प्रत्येक रिकॉर्ड अपफ्रंट के लिए सभी चाबियाँ जेनरेट कर सकते हैं और आपको पसंद करते हुए आवेषण बैच कर सकते हैं।

+0

अच्छा विचार है, लेकिन एक है लेकिन ... डेटाबेस को फिर से डिजाइन करने का समय बहुत समय लेने वाला होगा। एक नियोजित डेटाबेस रीडिज़ाइन है लेकिन अब नहीं। – Gabriel