与えられた:
- 何かが完了した
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.0000123
... Table5 でハングします (BenchMark が完了していないため)。もう一度実行すると、残りのログは次のようになります。
7780 Benchmark LoadXML took 00:00:04.1203923
...そして今ここにぶら下がっています。
それが役立つ場合は、ラックスペース クラウド ホスティングを使用しています。過去に、dbml ファイルからすべてのテーブルを削除して再読み込みすることでこれを修正できましたが、今回は機能しません。処理されているデータの量が問題を引き起こしているのでしょうか?
編集:この例のコードは、非同期スレッドで実行されます。スレッドが不明な理由で中断していることがわかったので、この問題を解決する理由を見つける必要があります。