次のコードで発生する悪いメモリ リークが発生しています。
public void BulkInsert(string tableName, IDataReader reader, String connectionString)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = tableName;
bulkCopy.BulkCopyTimeout = 900;
try
{
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
reader.Close();
}
}
}
}
このコード セグメントは何千回も実行されるため、メモリ不足の例外が発生するのに 1 分しかかかりません。Ants は、これは IDataReader が指す行が GC によって収集されていないためであると報告しています。ただし、次の行をコメントアウトしてもリークはありません。これは、問題をこのコードに分離した方法です。
bulkCopy.WriteToServer(reader);
メモリリークを防ぐ方法について誰か提案がありますか?
前もって感謝します。
コーリング コード:
var reader = datatable.CreateDataReader();
BulkInsert(tablename, reader, connectionString);
reader.Dispose();
datatable.Dispose();