2015-06-03 7 views
7

मैं अपने प्रोग्राम को माइक्रोसॉफ्ट एसक्यूएल सर्वर से MySQL में माइग्रेट कर रहा हूं। थोक प्रतिलिपि के साथ एक मुद्दा को छोड़कर सबकुछ अच्छी तरह से काम करता है।थोक डेटा को MySQL में कॉपी करें (System.Data.SqlClient.SqlBulkCopy के समान)

एमएस एसक्यूएल के साथ समाधान में कोड इस तरह दिखता है:

connection.Open(); 
SqlBulkCopy bulkCopy = new SqlBulkCopy(connection); 
bulkCopy.DestinationTableName = "testTable"; 
bulkCopy.WriteToServer(rawData); 

अब मैं MySQL के लिए इसी तरह के कुछ करने के लिए प्रयास करें। क्योंकि मुझे लगता है कि खराब प्रदर्शन होगा मैं डेटाटेबल को CSV फ़ाइल में लिखना नहीं चाहता हूं और MySqlBulkLoader कक्षा के साथ वहां से सम्मिलित करना चाहता हूं।

किसी भी मदद की अत्यधिक सराहना की जाएगी।

+0

संभावित डुप्लिकेट [क्या एक सी # प्रोग्राम मेमोरी में एक टेक्स्ट फ़ाइल पढ़ सकता है और फिर उस ऑब्जेक्ट को उस विधि में पास कर सकता है जिसके लिए फ़ाइल नाम की आवश्यकता होती है?] (Http://stackoverflow.com/questions/6308208/can-ac-sharp- प्रोग्राम-रीड-ए-टेक्स्ट-फाइल-इन-मेमोरी-एंड-टू-पास-द-ऑब्जेक्ट-टू) –

+0

इसके अलावा एक और उत्तर [यहां] (http://stackoverflow.com/a/23537155/2144390)। प्रदर्शन के संबंध में, क्या आपने यह देखने के लिए कोई परीक्षण किया है कि डेटा को डिस्क पर डंप करना है और फिर 'MySQLBulkLoader' का उपयोग करना वास्तव में एक समस्या होगी, या वास्तव में कुछ अन्य "अपने स्वयं के रोल" समाधान से भी बदतर होगा जो अस्थायी फ़ाइल का उपयोग नहीं करता है? –

उत्तर

7

क्योंकि मुझे लगता है कि खराब प्रदर्शन होगा, मैं डेटाटेबल को CSV फ़ाइल में लिखना नहीं चाहता हूं और MySQLBulkLoader क्लास के साथ वहां से सम्मिलित करना चाहता हूं।

निष्पक्ष धारणाओं के आधार पर संभावित समाधान को नकारें। मैंने System.Data.DataTable से Transaction के अंदर मानक MySqlDataAdapter#Update() का उपयोग करके एक MySQL तालिका में 100,000 पंक्तियों के सम्मिलन का परीक्षण किया। यह लगातार चलाने के बारे में 30 सेकंड ले लिया:

using (MySqlTransaction tran = conn.BeginTransaction(System.Data.IsolationLevel.Serializable)) 
{ 
    using (MySqlCommand cmd = new MySqlCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.Transaction = tran; 
     cmd.CommandText = "SELECT * FROM testtable"; 
     using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) 
     { 
      da.UpdateBatchSize = 1000; 
      using (MySqlCommandBuilder cb = new MySqlCommandBuilder(da)) 
      { 
       da.Update(rawData); 
       tran.Commit(); 
      } 
     } 
    } 
} 

(मैं UpdateBatchSize के लिए अलग मान के एक जोड़े की कोशिश की लेकिन वे बीता हुआ समय पर एक महत्वपूर्ण प्रभाव है लगता नहीं था।)

तक इसके विपरीत, MySqlBulkLoader का उपयोग कर निम्नलिखित कोड (का उपयोग कर चलाने के लिए केवल 5 या 6 सेकंड ...

string tempCsvFileSpec = @"C:\Users\Gord\Desktop\dump.csv"; 
using (StreamWriter writer = new StreamWriter(tempCsvFileSpec)) 
{ 
    Rfc4180Writer.WriteDataTable(rawData, writer, false); 
} 
var msbl = new MySqlBulkLoader(conn); 
msbl.TableName = "testtable"; 
msbl.FileName = tempCsvFileSpec; 
msbl.FieldTerminator = ","; 
msbl.FieldQuotationCharacter = '"'; 
msbl.Load(); 
System.IO.File.Delete(tempCsvFileSpec); 

... समय एक अस्थायी CSV फ़ाइल में DataTable से 100,000 पंक्तियों डंप करने के लिए सहित ले लिया this के समान कोड), उस फ़ाइल से थोक लोडिंग, और फ़ाइल को बाद में हटाया जा रहा है।

+0

आपको बहुत धन्यवाद। मैंने पाया कि आपकी दूसरी टिप्पणी के बाद खुद से बाहर :-) –

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