2013-02-11 61 views
2

我有一個分隔文件,我用它通過.net應用程序在sql server表中插入/更新記錄。 該文件包含約80000條記錄,並且每天都進行處理。 我的問題:當我旋轉80000行的每一行時,是否保持打開數據庫的連接是安全的或者明智的,還是應該關閉連接並重新打開循環的每次迭代?這聽起來很麻煩。 但是,我擔心長時間保持開放連接,鎖定並不必要地佔用內存。 什麼是更具擴展性,安全和明智的方式來做到這一點?在.net中長時間運行數據庫操作

+0

請定義'很長時間':小時?這是在一個事務中運行嗎?你指的是什麼鎖?你在哪裏使用內存,在SQL或在應用程序服務器?我不敢要求詳細說明更具可擴展性和安全性...... – rene 2013-02-11 19:27:50

+0

目前我用於測試的樣品只需要大約一個小時即可完成。但是,如果實際文件增長時,我將它移到生產它會更長。我沒有使用單個事務。 – 2013-02-11 19:33:02

+0

你的sqlserver超時了嗎?它可以處理一個額外的工人嗎?訂單是否重要? – rene 2013-02-11 19:40:20

回答

4

首先,不應該每行打開/關閉連接。對於80,000行,這將會花費很長時間,並會增加開銷。你可以考慮批處理行(重新設置每10-500行連接)。幸運的是,有更好的選擇:

其次,從.Net應用程序插入/更新多行到數據庫的正確方法是使用SQLBulkCopy methods,而不是INSERT或UPDATE命令。您應該使用SQLBulkCopy將數據行加載到暫存表/暫存表中,然後使用SQL存儲過程對en-mass中的實際表進行插入/更新。

如果您擔心SQLBulkCopy的持續負載,它具有內置的批處理選項。

使用這種技術,數據的初始上傳應該是至少快5倍,而實際的表插入/更新應該只是幾秒鐘的事情。

2

我曾經需要導入數據。但我必須在其上運行一些小型業務規則。 另外在我的要求是導入儘可能多的行,但如果有任何失敗,記錄它(但不要失敗整個導入)。

我寫下面的例子。

http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/

我向下傳遞的記錄N個(N = 1000示例)〜XML來存儲的過程。

N應該是可配置的,以找到一個「甜蜜點」。但是,一次一個太慢,而且一次有8萬個似乎很多。 1,000(行)x 80「運行」....是一個很好的起點,恕我直言。

因此,如果您的導入是「啞」,那麼先前建議的「SQLBulkCopy」可能是最好的方法。 但是,如果您有任何檢查或驗證,那麼我的樣本可能是一個很好的建議。

.......

另一種選擇:

http://msdn.microsoft.com/en-us/library/ms162802.aspx 的Bcp.exe

但是,這是不是真正的 「點網碼」。

+0

所以這是一個VS2005的例子。男人,我變老了!如果我今天這樣做,我會的。 (1)使用VS2010(至少)。 (2)更改EnterpriseLibrary v5,它已經具有OleDb的可用性,並且(3)將我的TSQL更改爲不使用OPENXML,而是使用「節點」語法。示例:http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html – granadaCoder 2013-02-11 21:15:10