为什么 Quartz .NET 3.0.7 调度程序挂起 DB 不可用错误

问题描述

我在 C# 控制台应用程序(作为 Windows 服务运行)中遇到了一个非常简单的非集群石英服务器的问题。它包括一个调度程序,它读取和写入单个数据库,这意味着同一组“qrtz_*”表。 偶尔,主要是在周末晚上,当我工作的公司执行数据库备份和一般维护时,我设置的调度程序侦听器会抛出

    QuartzSchedulerListener

Scheduler Error -> MESSAGE: An error occurred while scanning for the next trigger to fire.

Couldn't acquire next trigger: Fatal error encountered during command execution.

at Quartz.Impl.AdoJobStore.JobStoreSupport.d__229.MoveNext() in C:\projects\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 2688 --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Quartz.Impl.AdoJobStore.JobStoreSupport.d__262`1.MoveNext() in C:\projects\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 3816 --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw() at Quartz.Impl.AdoJobStore.JobStoreSupport.d__262`1.MoveNext() in C:\projects\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 3831 --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Quartz.Impl.AdoJobStore.JobStoreSupport.d__228.MoveNext() in C:\projects\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 2542 --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Quartz.Core.QuartzSchedulerThread.d__28.MoveNext() in C:\projects\quartznet\src\Quartz\Core\QuartzSchedulerThread.cs:line 262

我假设由于数据库暂时不可用。

然后,有时,它只是挂起并停止执行任何触发器 - 它不会更新触发器的 NEXT_FIRE_TIME,我只能重新启动控制台应用程序(重新配置调度程序并重新启动它)。

我尝试在调度程序配置连接字符串中增加 dbCOMmandTimeout,但它看起来好像陷入了某种死锁。

PS:我有一个类似的设置,一组从几个数据库读取/写入的石英 2.6.1 调度程序。他们在数据库维护方面遇到了同样的错误,但在一年多的活动中他们从未停止过。

我的想法已经用完了,请让我知道是否有人遇到过这种情况。

谢谢

解决方法

我们在 Quartz 版本 https://github.com/quartznet/quartznet/blob/main/changelog.md

我认为你必须将 Quartz 更新到至少 3.1,其中一些关于数据库不可用的死锁问题已得到修复:

还有一个非常重要的错误修复,用于重试锁定处理。在某些情况下,数据库锁处理可能会出现死锁。

希望它能帮助我,因为它帮助了我。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...