2010-05-03 103 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不是用於這樣的批量操作。