Сервер Hangfire аварийно завершает работу с ошибками подключения SQL

У меня есть проект ASP.NET MVC 5 под управлением Hangfire (1.6.17). У меня есть задания, работающие по 15-минутному графику. Эти задания обычно выполняются в течение 1-2 минут и выполняют некоторые функции SQL (обновление таблиц и т. Д.). Я также использую Hangfire.Console пакет для включения регистрации на соответствующей странице работы HF.

Спорадически, сервер падает, и виновником всегда является Hangfire.Console, записывающий строку обновления прогресса в SQL - однако он использует встроенный Hangfire.SqlServer пакет, поэтому я не уверен, кто виноват. Я не могу воспроизвести это локально, только на нашем промежуточном сервере, и задания могут нормально работать на HF-сервере в течение нескольких часов, а затем внезапно вылетать. Там, кажется, не существует никакого шаблона.

Кажется, что ошибки связаны с попытками обновить таблицы HF SQL. Я мог бы догадаться, но, возможно, это как-то связано с повторным использованием соединения?

Детали аварии:

Exception: System.InvalidOperationException

Message: Connection currently has transaction enlisted.  Finish current transaction and retry.

StackTrace:    at System.Data.SqlClient.SqlConnection.EnlistTransaction(Transaction transaction)
   at Hangfire.SqlServer.SqlServerStorage.<>c__DisplayClass27_0`1.<UseTransaction>b__0(DbConnection connection)
   at Hangfire.SqlServer.SqlServerStorage.UseConnection[T](DbConnection dedicatedConnection, Func`2 func)
   at Hangfire.SqlServer.SqlServerStorage.UseTransaction[T](DbConnection dedicatedConnection, Func`3 func, Nullable`1 isolationLevel)
   at Hangfire.SqlServer.SqlServerStorage.UseTransaction(DbConnection dedicatedConnection, Action`2 action)
   at Hangfire.SqlServer.SqlServerWriteOnlyTransaction.Commit()
   at Hangfire.Console.Storage.ConsoleStorage.AddLine(ConsoleId consoleId, ConsoleLine line)
   at Hangfire.Console.Server.ConsoleContext.AddLine(ConsoleLine line)
   at API.Engines.JobEngine.<>c__DisplayClass9_0.<Setup>b__0(String x) in C:\agent01\_work\55\s\API\Engines\JobEngine.cs:line 68
   at System.Progress`1.InvokeHandlers(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()

а также

Exception: System.InvalidOperationException

Message: There is already an open DataReader associated with this Command which must be closed first.

StackTrace:    at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
   at System.Data.SqlClient.SqlConnection.RepairInnerConnection()
   at System.Data.SqlClient.SqlConnection.EnlistTransaction(Transaction transaction)
   at Hangfire.SqlServer.SqlServerStorage.<>c__DisplayClass27_0`1.<UseTransaction>b__0(DbConnection connection)
   at Hangfire.SqlServer.SqlServerStorage.UseConnection[T](DbConnection dedicatedConnection, Func`2 func)
   at Hangfire.SqlServer.SqlServerStorage.UseTransaction[T](DbConnection dedicatedConnection, Func`3 func, Nullable`1 isolationLevel)
   at Hangfire.SqlServer.SqlServerStorage.UseTransaction(DbConnection dedicatedConnection, Action`2 action)
   at Hangfire.SqlServer.SqlServerWriteOnlyTransaction.Commit()
   at Hangfire.Console.Storage.ConsoleStorage.AddLine(ConsoleId consoleId, ConsoleLine line)
   at Hangfire.Console.Server.ConsoleContext.AddLine(ConsoleLine line)
   at API.Engines.JobEngine.<>c__DisplayClass9_0.<Setup>b__0(String x) in C:\agent01\_work\55\s\API\Engines\JobEngine.cs:line 68
   at System.Progress`1.InvokeHandlers(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()

Я просто не знаю точно, как мне избежать этой проблемы, будь то изменение уровня изоляции, увеличение размера пакета и т. Д. Документация по HF хороша, но не исчерпывающая, поэтому трудно понять, с чего начать. Любой совет высоко ценится!

0 ответов

Другие вопросы по тегам