IIS后台job运行问题记录- 基于ASP.NET Boilerplate Background Jobs and Workers

基于ASP.NET Boilerplate Background Jobs and Workers的后台job,长时间轮训读取和操作db,遇到的问题整理如下: 

环境及数据:

Windows Server 2008 R2 ER ,IIS7.5 独立应用池

SQLServer2008 R2  400多万条记录

问题1:web前台页面提示超时,超时时间两分钟(请求会经过web进行中转)

IIS后台job运行问题记录- 基于ASP.NET Boilerplate Background Jobs and Workers_第1张图片

原因是IIs应用池Application Request Routing 中的Proxy Setting 里面的Time-out默认时间为120秒,修改该超时时间,同时优化索引和查询sql。

还有修改代理和webapi站点下web.config中的 httpRuntime -executionTimeout节点时间,默认是110秒。

问题2:sql执行超时,SqlCommand.CommandTimeout

原因是SqlCommand.CommandTimeout的默认时间是30秒,修改为将多条拼接sql分开执行,同时加长超时时间。

问题3:使用SqlBulkCopy进行大数据批量插入DB失败

原因是SqlBulkCopy的超时时间是30s秒,修改超时时间,同时进行分批插入。

问题4:BackgroundJob在iis中执行超过20分钟,停止计算,无任何日志。

原因是当前站点超过20分钟无request请求,进程回收。

修改如下:应用程序池(Application Pool),Process Model->Idle Time-out设置为0(不让应用程序池因为没有请求而回收);Recycling->Regular Time Interval设置为0(禁用应用程序池定期自动回收)。

问题5:异常System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout ,异常The transaction associated with the current connection has completed but has not been disposed.  The transaction must be disposed before the connection can be used to execute SQL statements 。

原因是ASP.NET Boilerplate框架服务层默认带Transactions,Transactions默认最大超时10分钟并且不可在代码中覆盖设置(maximum transaction timeout只能在machine.config文件中进行配置),将默认的事务锁从服务层去掉,仅在关键逻辑增加事务。 同时, TransactionScope默认的超时时间是60秒,在web.config中增加默认值或者创建的时候指定默认值。

void Main()
{//打印出默认值
	 var op=  new TransactionOptions()
	            { 
	                Timeout = TransactionManager.DefaultTimeout
	            };
	 op.Timeout.TotalSeconds.ToString()+"s").Dump();
}

参考:

http://www.cnblogs.com/dudu/archive/2013/06/08/iis_webserver_settings.html

http://www.cnblogs.com/ceci/p/4203029.html

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.bulkcopytimeout(v=vs.110).aspx

你可能感兴趣的:(web,.net)