5

我正在阅读 Excel 表并应用我的业务逻辑,我正在尝试使用Linq to SQL.

在我的循环中,我有> (greater than) 5,000 records并且< (Less than) 15,000 records要插入。

public List<tblLog> tblLogList = new List<tblLog>(); 

此方法在循环内部:

public void SaveLog()
{
    tblLog tnlog = new tblLog();
    tnlog.id = Guid.NewGuid();
    tnlog.comp_id = Comp_id;
    tnlog.branch_id = Branch_id;
    tnlog.row_id = rowID;
    tnlog.his_id = his_id;
    
    //Add records to List
    tblLogList.Add(tnlog);

早些时候,我曾尝试将此代码逐个提交:

    //_trContext.tblLogs.InsertOnSubmit(tblLog);
    //_trContext.SubmitChanges();

由于性能命中,我已更改InsertOnSubmitInsertAllOnSubmit

    if (tblLogList.Count >= 1000)
    {
         _trContext.tblLogs.InsertAllOnSubmit(tblLogList);
         _trContext.SubmitChanges();
         tblLogList.Clear();
    }
}

我的问题是:

  1. 我可以在 Linq to Sql 中通过 InserAllOnSubmit() 插入的最大记录数是多少。

  2. 通过我上面的代码,我获得了多达 1000 条记录,但我发誓,当代码用于 10,000 条或更多记录时,它可能会通过一些记录,Timeout Exception因为它在我的**windows service**.

    我真的很困惑,处理上述逻辑的最佳建议是什么?

提前致谢。

4

3 回答 3

5

虽然其他人正确地指出此任务有更好的解决方案,但尚未直接回答您的问题。

答案是,从技术上讲,这个数字要么受到上下文通过吞下所有这些新对象而消耗的内存量的限制,要么受到数据库事务日志的最大大小的限制。前者更有可能成为瓶颈,但您可以通过以数百或数千块的形式提交记录并为每个批次使用新的上下文 (!)来防止达到这两个限制。

正如你所说,一个实际的限制可能是命令超时(如果你不想让它永远存在)。这也可以通过分批提交来规避,因此,为每个批次启动一个新命令。

功能限制取决于过程是否无人看管(耐心),以及数据是否有望在一定时间内可用。如果这些要求很严格,您可能不得不求助于其他答案中建议的解决方案之一。

于 2013-06-20T18:01:24.627 回答
3

在该卷上,我将使用 SqlBulkCopy,可能通过 DataTable,或者可能通过 FastMember 的 ObjectReader API,它从类型对象列表创建 IDataReader,适用于提供给 SqlBulkCopy。

于 2013-06-20T16:06:49.390 回答
2

您为这项工作使用了错误的工具。LINQ-to-SQL 和大多数其他 ORM 用于OLTP。您不是在这里做 OLTP,而是在做“批量”插入ETL。使用正确的工具,例如SqlBulkCopy专用框架

于 2013-06-20T16:07:25.457 回答