因为我认为性能会很差,所以我不想将DataTable写入CSV文件并使用MysqLBulkLoader类从那里进行插入。
不要根据无根据的假设排除可能的解决方案。我只是测试的从100,000行插入System.Data.DataTable
使用标准到MysqL表MysqLDataAdapter#Update()
内Transaction
。持续大约需要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);
…包括以下时间:将DataTable中的100,000行转储到临时CSV文件中(使用与此类似的代码),从该文件中批量加载,然后再删除该文件。