考虑: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中,我对Table3
,Table2
和Table1
没有问题(这意味着该交易被中止?)
因为它挂起运行查询,我会去重新运行该程序。这一次,它迟早挂起,所以我可能会得到日志是这样的:
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文件中删除所有表并读取它们,但是这次它不起作用来解决此问题。我想知道正在处理的数据量是否会导致问题?
编辑:此示例中的代码在异步线程中运行。我发现线程正在中止未知的原因,我需要找出为什么要解决这个问题。
你可以尝试在每个批量拷贝之后对事务进行提交,然后看看会发生什么? – mservidio 2011-04-26 21:31:10
我会看看这是否有效,但这不会解决问题,因为数据是版本化的,事务需要原子化。 – DJTripleThreat 2011-04-26 21:36:14
您要处理的每个批量插入行的行数是多少? – mservidio 2011-04-26 21:40:06