LINQ to SQL 插入数百万条记录时出现超时问题

3
我正在使用这个解决方案向数据库中插入大约3百万条记录。最终,当应用程序插入记录一段时间后(我的上次运行持续了约4个小时),会出现以下SqlException的超时错误:

"SqlExcepetion: Timeout expired. The timeoutperiod elapsed prior to completion of the operation or the server is not responding."

如何处理这个异常?有没有办法预防它的发生,或者我应该捕获这个异常?
提前致谢!
3个回答

10

如果你手头只有一把锤子,那么每个问题都看起来像是一个钉子。

说真的,甚至尝试使用Linq2SQL插入300万条记录也是一个错误的方法。ORM有很多好东西,但它们不是批量插入元素。

我建议:

  • 将表数据生成到文件中
  • 使用适当的工具(批量加载机制)加载文件。你会惊讶于其性能(提示:我在15分钟内加载了大约6亿条记录);)

批量加载有很多性能优势。自然而然地,假设你在这里谈论的是类似ETL加载过程,但我认为300万条数据加载肯定和实时事务处理没有任何关系,它明确且根据定义是一种数据仓库/报告/归档式的加载操作;)

为工作选择正确的工具。


我相信这个表达是“如果你的唯一工具是锤子……” - si618
无论表达式是什么,这都是一个很棒的解释!点赞给这个答案,胜利! - Bas
2
除了TomTom的回答外,还可以看一下SqlBulkCopy类:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx - Jakob Christensen
在我正在构建的应用程序中,我只添加了数万条记录,而不是数百万条,但使用linq2sql却让我感到非常困扰。SqlBulkCopy产生了巨大的差异,并且我能够将其轻松地与linq2sql一起构建到我的数据层类中。 - Mike Jacobs

3
生成一个SQL脚本(或字符串),并直接执行它。 L2SQL不适用于此类大规模操作。

2

我认为你需要增加命令的超时时间(CommandTimeout)。

解决方案可以在这里找到。


请参见https://dev59.com/jEfSa4cB1Zd3GeqPAtxh#949381 - abatishchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接