2017-02-20 140 views
1
public async Task BulkInsert(List<WagerInfo> wagers) 
{ 
    var tasks = wagers.Select(async x => await insert(x)); 

    await Task.WhenAll(tasks); 
} 
private Task insert(WagerInfo wager) 
{ 
    var sw = new Stopwatch(); 

    sw.Start(); 

    using (var db = new DBContext()) 
    { 
     db.Wagers.Add(wager); 

     await db.SaveChangesAsync(); 
    } 

    sw.Stop(); 

    log("save one record spent : " + sw.Elapsed); 
} 

这是插入记录的简单代码。多插入使用异步等待

但日志显示保存的一条记录有时会花费超过1秒。

保存一个记录花费:00:00:00.0180819

保存一个记录花费:00:00:00.0239751

保存一个记录花费:00:00:00.0089301

保存一个记录花费:00:00:00.0116161

保存一个记录花费:00:00:00.0736537

保存Ø NE记录花费:00:00:00.0711155

保存一个记录花费:00:00:03.1613426

保存一个记录花费:00:00:03.1703909

保存一个记录花费:00:00: 03.1727551

保存一个记录花费:00:00:07.8156325

保存一个记录花费:00:00:07.8137410

保存一个记录花费:00:0 0:07.8179925

保存一个记录花费:00:00:00.0079545

保存一个记录花费:00:00:00.0074952

但我的DBA说,他不赶执行的任何警报时间超过4秒。

为什么有一些记录插入超过1秒?

如果我更改插入方法ado.net会更好?

+0

有问题与连接池的设置。由于它是获得竞争等待,您登录的连接池是一个补充说,时间到SQL执行时间...记录时间一旦你有连接.... –

+0

谢谢你的提示!我会尝试。 – user1485954

回答

0

保存更改针对同一事务中的多个插入进行了优化。

以500或1000个插入块的形式拆分列表。

然后打电话给你的Task insertList <WagerInfo>到前SaveChangesAsync