Không loại trừ một giải pháp khả thi dựa trên những giả định vô căn cứ. Tôi vừa thử nghiệm việc chèn 100.000 hàng từ System.Data.DataTable
vào bảng MySQL bằng MySqlDataAdapter#Update()
tiêu chuẩn bên trong Transaction
. Liên tục mất khoảng 30 giây để chạy:
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();
}
}
}
}
(Tôi đã thử một vài giá trị khác nhau cho UpdateBatchSize
nhưng chúng dường như không có tác động đáng kể đến thời gian đã trôi qua.)
Ngược lại, mã sau sử dụng MySqlBulkLoader
chỉ mất 5 hoặc 6 giây để chạy ...
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);
... bao gồm cả thời gian để kết xuất 100.000 hàng từ DataTable sang tệp CSV tạm thời (sử dụng mã tương tự như this ), tải hàng loạt từ tệp đó và xóa tệp sau đó.