2011-04-26 66 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

相关问题