У меня есть сайт ac #, который регистрирует вызовы API, он вставляет журнал как одну строку в базу данных SQL Server.Когда сайт становится действительно занятым, это крайняя точка, таблица журнала блокируется, и мы видим тайм-ауты, ожидающие соединения с базой данных.Я пытаюсь исправить это с помощью SqlBulkCopy
.Исходный метод журнала заменяется одним в новом классе BulkLogger
, и когда DataTable, содержащий журналы, достигает предела (на данный момент 100), вызывается метод Flush()
и все журналы записываются в базу данных.
Исходный метод журнала вызывался из всего кода, это старый код без DI, поэтому мне пришлось создать new BulkLogger
в нескольких местах.Я обеспокоен тем, что некоторые журналы не будут записываться, потому что исключения обрабатываются плохо, и BulkLogger
может быть утерян, или просто, когда запрос страницы завершится, если некоторые журналы все еще находятся в памяти и ожидают, что их будет BulkCopied.
Мой BulkLogger
класс может быть запечатан, и у меня нет ресурсов для очистки или удаления.Поэтому, если BulkLogger
реализует IDisposable, а я реализую Dispose, как показано ниже, это означает, что в большинстве случаев все журналы записываются в базу данных?
public sealed class BulkLogger : IDisposable
{
DataSet _logSet;
DataTable _logTable;
public BulkLogger() {
// set up the dataset and datatable
}
public void Log(string message, DateTime logTime) {
// add message and time to _logTable
// if _logTable.count > 100 call Flush()
}
public void Flush() {
// Use SqlBulkCopy to insert logs
}
public void Dispose()
{
Flush();
}
}