2010-05-03 87 views
3

我使用this solution在数据库中插入了大约300万条记录。最后,当应用程序已被插入记录了一段时间(我上次运行持续了大约4个小时),它给出了下面的SQLException超时:在LINQ to SQL中超时插入数百万条记录

“SqlExcepetion:超时过期的timeoutperiod过去完成之前,操作或服务器没有响应。“

处理此异常的最佳方法是什么?有没有办法来防止这种情况发生,或者我应该发现异常?

提前致谢!

回答

10

如果你拥有的一切是一把锤子,所有问题看起来都像钉子。

说真的,即使试图使用Linq2SQL插入300万条记录也是一种破坏性的方法。 ORM是很多好东西,它们不是批量插入元素。

我建议:

  • 生成表数据到一个文件
  • 负载使用合适的工具(批量加载机构)的文件。你会对性能感到惊讶(提示:我在15分钟内载入大约6亿条记录);)

大容量负载有很多性能优势。自然地,假设你在这里谈论ETL加载过程 - 但是除了数据仓库/报告/归档风格的加载操作之外,我没有看到任何300万的加载,它最初和最终定义都不是实时事务处理;)

使用正确的工具进行工作。

+0

我相信这样的表达是“如果你唯一的工具是一把锤子......” – si618 2010-05-03 11:27:09

+0

不管表达是,这是一个很好的解释!为这个游戏者+1,赢! – Bas 2010-05-03 11:31:00

+2

除了TomTom的回答,看看SqlBulkCopy类:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx – 2010-05-03 11:40:20

2

我认为你必须增加命令的CommandTimeout。

解决方案,可以发现here

+0

参见http://stackoverflow.com/questions/949374/to-increase-the-timeout-period/949381#949381 – abatishchev 2010-05-03 11:21:52

3

生成一个SQL脚本(或字符串),并直接执行。

L2SQL不是用于这样的批量操作。