【发布时间】:2016-01-19 09:04:34
【问题描述】:
我使用在 IIS 中运行的 MVC 开发了一个 Hangfire 应用程序,它工作得非常好,直到我看到我的 SQL Server 日志文件的大小,一夜之间增长了 40 GB!
根据我们的 DBA 提供的信息,有一个长时间运行的事务,带有以下 SQL 语句(我有 2 个挂起队列)-
(@queues1 nvarchar(4000),@queues2 nvarchar(4000),@timeout float)
delete top (1) from [HangFire].JobQueue with (readpast, updlock, rowlock)
output DELETED.Id, DELETED.JobId, DELETED.Queue
where (FetchedAt is null or FetchedAt < DATEADD(second, @timeout, GETUTCDATE()))
and Queue in (@queues1,@queues2)
在探索 Hangfire 库时,我发现它用于使作业出队,并执行一项非常简单的任务,不应该花费任何时间。
我找不到任何会导致此错误的东西。事务与using 语句一起正确使用,对象为Disposed,以防出现异常。
正如一些帖子中所建议的,我检查了我的数据库的恢复模式并验证它很简单。
我手动终止了挂起的事务以回收日志文件空间,但几个小时后它又出现了。我一直在观察它。
这种行为的原因可能是什么?以及如何预防?
这个问题似乎是间歇性的,部署在生产环境中的风险可能非常高:(
【问题讨论】:
-
您是否为
SqlServerStorageOptions.QueuePollInterval属性设置了自定义值?使用什么值? -
@odinserj:不,我没有改变它。它应该使用默认的 15 秒间隔。
-
你们总共有多少工人?
-
@odinserj - 我总共有 20 名工人
-
@odinserj - 如果我错了,请纠正我,我观察到事务在作业执行之前一直保持打开状态。因此,对于需要几个小时才能完成的长时间运行的作业,事务是打开的,并且它会不断增加日志大小。如果正确,如何解决。