2011-04-26 65 views
0

考慮:SqlBulkCopy.WriteToServer掛起Thread.Abort的叫,但不知道爲什麼

  • 一個BenchMark類,讓我知道什麼時候事情已經完成。
  • 已經被解析成多個列表

一個非常大的XML文件(〜120MB)的某些代碼:

SqlConnection con = null; 
SqlTransaction transaction = null; 

try 
{ 
    con = getCon(); // gets a new connection object 
    con.Open(); 
    transaction = con.BeginTransaction(); 

    var bulkCopy = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, transaction) 
    { 
    BatchSize = 1000, 
    DestinationTableName = "Table1" 
    }; 

    // assume that the BenchMark class is working 
    b = new BenchMark("Table1"); 
    bulkCopy.WriteToServer(_insertTable1s.AsDataReader()); // _insertTables1s is a List<Table1> 
    b.Complete(); 
    LogHelper.WriteLogItem(b); 

    b = new BenchMark("Table2"); 
    bulkCopy.DestinationTableName = "Table2"; 
    bulkCopy.WriteToServer(_insertTable2s.AsDataReader()); // _insertTables2s is a List<Table2> 
    b.Complete(); 
    LogHelper.WriteLogItem(b); 

    // etc... this code does a batch insert into about 7 tables all having about 40,000 records being inserted. 

    b = new BenchMark("Transaction Commit"); 
    transaction.Commit(); 
    b.Complete(); 
} 
catch (Exception e) 
{ 
    transaction.Rollback(); 

    LogHelper.WriteLogItem(
    LogLevel.Critical, 
    LogType.DataProcessing, 
    e.ToString()); 
} 
finally 
{ 
    con.Close(); 
} 

問題:

在我的本地開發環境,一切安好。當我在雲中運行這個操作時會導致它掛起。使用LogHelper.WriteLogItem方法,我可以看到這個過程的進展。我觀察它隨機掛在一張特定的桌子上。不會引發異常,因此事務不會回滾。說它掛在Table2批量插入。使用MS SQL Management Studio中,我對Table3Table2Table1沒有問題(這意味着該交易被中止?)

因爲它掛起運行查詢,我會去重新運行該程序。這一次,它遲早掛起,所以我可能會得到日誌是這樣的:

7755 Benchmark LoadXML took 00:00:04.2432816 
7756 Benchmark Table1 took 00:00:06.3961230 
7757 Benchmark Table2 took 00:00:05.2566890 
7758 Benchmark Table3 took 00:00:08.4900921 
7759 Benchmark Table4 took 00:00:02.000

...它掛在表5(因爲基準從未完成)。我去運行它,日誌的其餘部分看起來像:

7780 Benchmark LoadXML took 00:00:04.1203923 

...它現在掛在這裏。

如果有幫助,我正在使用rackspace雲託管。我已經能夠通過從我的dbml文件中刪除所有表並讀取它們,但是這次它不起作用來解決此問題。我想知道正在處理的數據量是否會導致問題?

編輯:此示例中的代碼在異步線程中運行。我發現線程正在中止未知的原因,我需要找出爲什麼要解決這個問題。

+0

你可以嘗試在每個批量拷貝之後對事務進行提交,然後看看會發生什麼? – mservidio 2011-04-26 21:31:10

+0

我會看看這是否有效,但這不會解決問題,因爲數據是版本化的,事務需要原子化。 – DJTripleThreat 2011-04-26 21:36:14

+0

您要處理的每個批量插入行的行數是多少? – mservidio 2011-04-26 21:40:06

回答

0

因爲這個過程是異步完成的(即一個線程被啓動來處理這個線程),線程有一個問題會中止它,這就是爲什麼我會在代碼在不同地方停頓時出現奇怪的行爲。我通過同步完成這個任務解決了這個問題(它可以工作,但並不理想)。

我想真正的問題是爲什麼我的線程正在中止,因爲我沒有在我的任何代碼中放棄它。我相信這是由於正在處理的數據量很大,但我可能是錯的。

無論哪種方式,我已經解決了我的問題。

1

如果你有管理您的服務器或數據庫,您可以運行

SELECT * FROM sys.dm_tran_session_transactions 

,看看有什麼交易是當前活動 - 從Pinal

此外,您可以運行sp_lock,以確保有ISN」阻止你的交易。

+0

+1,因爲這很有用,但這不會幫助我,因爲我的開發和生產環境託管在雲中,因此我無法訪問該表/視圖。 – DJTripleThreat 2011-04-26 23:44:02

相關問題