Quartz JobStoreTX超时已过期

时间:2014-10-30 13:47:42

标签: c# sql-server-2008 quartz.net

我在C#Windows服务中使用Quartz.NET。与持久存储数据和其他内容通信的数据库存在于运行SQL Server 2008的同一网络中的另一台机器上。

每天晚上我都会保持服务运行并回家。当我早上回来时,Quartz.NET处于糟糕的状态。第一个错误始终是SQL超时,发生在下午6点左右。 这很奇怪,因为数据库在那个时候几乎处于空闲状态,并且Quartz的持续ping不会给连接提供过期的机会或其他:编辑: 请参阅下文了解详情。)

2014-10-29 18:22:04,435 [InfoSnapScheduler_QuartzSchedulerThread] WARN  Quartz.Impl.AdoJobStore.JobStoreTX [(null)] – ConnectionAndTransactionHolder passed to RollbackConnection was null, ignoring
2014-10-29 18:22:04,435 [InfoSnapScheduler_QuartzSchedulerThread] ERROR Quartz.Core.ErrorLogger [(null)] – An error occurred while scanning for the next trigger to fire.
Quartz.JobPersistenceException: Failure setting up connection. ---> System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName)
   at System.Data.SqlClient.SqlInternalConnection.BeginTransaction(IsolationLevel iso)
   at System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel isolationLevel)
   at System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction(IsolationLevel isolationLevel)
   at Quartz.Impl.AdoJobStore.JobStoreSupport.GetConnection() in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 380

之后,它会不断循环第1行的WARN。

关注超时错误 - 数据库失误发生了。我认为Quartz不应该责怪那里。但我需要能够从这些错误中恢复并保持Quartz处于良好状态以保持ping,尽管等待之后。在检查触发器时,有什么我可以覆盖或修改以捕获错误吗?

备选问题:如何解决/阻止此ConnectionAndTransactionHolder问题?

编辑:服务器管理员与我分享数据库每天复制四次,包括 - 等待它! - 6便士我认为这是原因。最初的问题仍然是如何从它产生的错误中恢复过来。

1 个答案:

答案 0 :(得分:0)

结果显示ConnectionAndTransactionHolder消息实际上并不是错误:在Quartz.NET 2.3中,它将被记录为INFO。在这个消息引起的焦虑加剧之后,我认为Quartz从来没有真正处于糟糕状态。 (当时我的代码处于比服务本身更糟糕的状态 - 也许这就是我所遭受的痛苦!)事实上,经过一夜的奔跑似乎很好。

然而,我确实在GitHub上提交了一张票,要求Quartz在数据库关闭时不那么经常ping数据库。