2010-08-08 19 views
5

एक पंक्ति (jdbc/connector-mysql डेटाबेस) में 1000 पंक्तियों को सम्मिलित करने का सबसे अच्छा/सबसे अधिक समय प्रभावी तरीका क्या है? (यह एक बफर है और इसे पूर्ण होने पर डेटाबेस में डंप करने की आवश्यकता है)कुशल एकाधिक SQL प्रविष्टि

1- एक ऑटो जेनरेट/समेकित SQL कथन?

2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();

3- प्रक्रिया संग्रहीत?

4- फ़ाइल के माध्यम से थोक डेटा सम्मिलन?

5- (अपने समाधान)

उत्तर

2

The LOAD DATA INFILE statement शायद प्रदर्शन के लिए आपकी सबसे अच्छी शर्त है। (उपरोक्त विकल्पों की आपकी सूची से # 4) हालांकि यह आपके कार्य को पूरा करने के लिए शायद अधिक कोड लेगा क्योंकि आपको इंटरमीडिएट फ़ाइल बनाने की आवश्यकता है, इसे सर्वर पर ले जाएं और फिर इसे अपने डीबी में लाने के लिए लोड डेटा को कॉल करें।

MySql सहायता पृष्ठों बोली:

डेटा लोड INFILE बयान एक बहुत ही उच्च गति पर एक तालिका में एक पाठ फ़ाइल से पंक्तियों पढ़ता है।

+0

सावधानी के साथ इस दृष्टिकोण का उपयोग करें। मैंने सिस्टम को देखा है जो अतीत में ऐसा किया है और इंटरमीडिएट फ़ाइल बनाने और इसे सर्वर पर शिपिंग करने की लागत ने फास्ट फाइल लोड ऑपरेशन का उपयोग करने के प्रदर्शन लाभों को अधिक से अधिक किया है। –

+0

यह बहुत खतरनाक लग रहा है क्योंकि हमारे पास दो ऐप सर्वर समान डाटाबेस तक पहुंच रहे हैं। मैं उस जवाब के बारे में वास्तव में डर गया था। आपके उत्तर के लिए धन्यवाद। –

0

आप JDBC बैच आवेषण उपयोग कर सकते हैं।

PreparedStatement ps = cn.prepareStatement("INSERT INTO...."); 

for (int i = 0; i < 1000; i++) { 
    ps.setString(1, "value-" + i); // Set values 
    ps.addBatch();     // Add this to the batch 
    ps.clearParameters();   // Reset the parameters 
} 

ps.executeBatch(); 

हालांकि MySQL के बैच डालने कार्यक्षमता देशी रूप का समर्थन नहीं करता है, तो उचित प्रदर्शन आप अपने mysql JDBC विन्यास को rewriteBatchedStatements=true जोड़ने की आवश्यकता होगी पाने के लिए।

एक MySQL विशिष्ट बैच डालने वाक्यविन्यास भी है जिसका उपयोग आप एक बड़ी SQL स्ट्रिंग बनाना चाहते हैं, तो आप इसका उपयोग कर सकते हैं। मैं दोनों कोशिश करता हूं और प्रदर्शन का परीक्षण करता हूं।

INSERT INTO x (a,b) 
    VALUES ('1', 'one'), 
      ('2', 'two'), 
      ('3', 'three'); 

दोनों दृष्टिकोणों से सावधान रहें क्योंकि आप एक ही अनुरोध के लिए अधिकतम पैकेट आकार से अधिक हो सकते हैं। आपको बैच आकार सेट करने की आवश्यकता हो सकती है जो आपके बफर में प्रविष्टियों की संख्या से अलग है। जैसे आपको 100 प्रविष्टियों में 1000 प्रविष्टियों को विभाजित करने की आवश्यकता हो सकती है।

0

ध्यान दें कि जेडीबीसी प्रत्येक कथन के बाद ऑटो-काम करता है, जब तक कि आप इसे स्पष्ट रूप से नहीं बताते। ऐसा करने और प्रतिबद्ध करने से पहले एक्स आवेषण चलाते हुए, अपने प्रदर्शन को थोड़ा सुधारना चाहिए।

+0

मैं लिखना भूल गया कि मैं c3p0 का उपयोग कर रहा था। इसलिए मुझे अंत में प्रतिबद्ध होना है। –

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