2014-10-30 106 views
0

我在C#Windows服务中使用Quartz.NET。它与之通信的数据库用于持久存储数据和其他内容,它们位于运行SQL Server 2008的同一网络中的另一台计算机上。Quartz JobStoreTX超时已过期

每天晚上我都会让服务继续运行并回家。当我早上回来时,Quartz.NET处于不良状态。第一个错误总是在下午6点左右发生SQL超时。 这很奇怪,因为数据库是接近怠速到那个时候,和石英的不断爆震不会给连接一个机会,过期或什么: 编辑:请参见下面的新的细节)

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处于良好状态以保持ping状态,尽管在等待之后。有什么我可以覆盖或修改,以检查触发器时捕获错误?

替代问题:如何修复/防止ConnectionAndTransactionHolder问题?

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

+0

你能分享你的配置文件吗? – 2014-10-30 14:45:05

+0

@CircularReference:可能是一个严重消毒的版本。如果你想看到它的原因是关于超时本身,那么这件事已经解决了。查看修改。 – spamguy 2014-10-30 14:53:02

+0

“quartz.jobstore.misfirethreshold”的值是多少? – 2014-10-30 15:01:40

回答

0

原来,ConnectionAndTransactionHolder消息实际上并不是一个错误:在Quartz.NET 2.3中它将被记录为INFO。在这个信息引起焦虑加剧之后,我认为Quartz从来没有处于一个糟糕的状态。 (当时我的代码处于比服务本身更糟糕的状态 - 也许这正是我所经历的!)确实,在运行一夜之后,它似乎很好。

但是,我在GitHub上申请了一张票,要求Quartz在发生故障时不太频繁地ping数据库。

相关问题