System.Data.SqlClient.SqlException:超时已过期

时间:2011-01-18 02:01:53

标签: c# asp.net sql-server-2008 iis-7

前几天我注意到我的网络应用程序给了我一个异常超时的sql过期。

我清理了几个存储过程,占用了更多的CPU并重新启动了SQL Server服务,我的应用程序开始工作,因为它在快速且没有任何延迟之前。三四个小时后我再次检查它,我无法加载一个页面,而不是它给我的异常超时到期。我检查了服务器 CPU 是好的,一切都很好。我在同一个 IIS 7 下有一些其他网站,它们运行良好,没有任何例外。我再次重新启动SQL Server服务,我的应用程序再次恢复正常。 我认为它看起来像SQL服务器数据库上的问题,但我不知道如何解决它。

所以每当我遇到异常时我都会重启sql服务但当然这不是最好的方法。请帮我解决这个问题。

这是我得到的一个例外。

  

消息:类型异常   'System.Web.HttpUnhandledException'   被扔了。资料来源:System.Web Inner   例外:System.Data.UpdateException:   更新时发生错误   条目。请参阅InnerException   细节。 --->   System.Data.SqlClient.SqlException:   超时已过期。超时期限   在完成之前已经过去了   操作或服务器不是   响应。声明一直如此   终止。在   System.Data.SqlClient.SqlConnection.OnError(SQLEXCEPTION   exception,Boolean breakConnection)at   System.Data.SqlClient.SqlInternalConnection.OnError(SQLEXCEPTION   exception,Boolean breakConnection)at   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject   stateObj)at   System.Data.SqlClient.TdsParser.Run(RunBehavior   runBehavior,SqlCommand cmdHandler,   SqlDataReader dataStream,   BulkCopySimpleResultSet   bulkCopyHandler,TdsParserStateObject   stateObj)at   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader的   ds,RunBehavior runBehavior,String   resetOptionsString)at   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,Boolean async)   在   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,String方法,   DbAsyncResult结果)at   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult   result,String methodName,Boolean   sendToPipe)at   System.Data.SqlClient.SqlCommand.ExecuteNonQuery()   在   System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator   翻译,EntityConnection   连接,字典2 identifierValues, List 1   generatedValues)at   System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager   stateManager,IEntityAdapter适配器)   ---内部异常堆栈跟踪的结束---在System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager)   stateManager,IEntityAdapter适配器)   在   System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager   entityCache)   System.Data.Objects.ObjectContext.SaveChanges(布尔   acceptChangesDuringSave)at   System.Data.Objects.ObjectContext.SaveChanges()   在   BCSCDomain.Domain.DataLayer.OtherDataLayer.UpdateHitCounter(的Int32   hlistid,Int32 hcounterid)at   BuyCarandSellCar.UsedCarProfilePage.HitCounter()   在   BuyCarandSellCar.UsedCarProfilePage.Page_Load(对象   发件人,EventArgs e)at   错误帮助(IntPtr的   fp,Object o,Object t,EventArgs e)   在   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象   发件人,EventArgs e)at   System.Web.UI.Control.OnLoad(EventArgs的   吃   System.Web.UI.Control.LoadRecursive()   在   System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)Stack   追踪:at   System.Web.UI.Page.HandleError(例外   吃   System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)at   System.Web.UI.Page.ProcessRequest(布尔   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)at   System.Web.UI.Page.ProcessRequest()at   System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext的   上下文)   System.Web.UI.Page.ProcessRequest(HttpContext的   上下文)   ASP.usedcarlistings_profilepage_aspx.ProcessRequest(HttpContext的   上下文)   C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \临时   ASP.NET   文件\ ROOT \ 79794658 \ 835d6695 \ App_Web_kmrmpdbb.16.cs:行   0点   System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   在   System.Web.HttpApplication.ExecuteStep(IExecutionStep   步,布尔& completedSynchronously)

2 个答案:

答案 0 :(得分:5)

嗯,首先,它是导致问题的近端功能“UpdateHitCounter”,但你不知道这是一个原因还是一个效果。您的查询超出了分配完成的配置时间。

每当您的数据库性能不佳时,您可以运行的广泛笔划方法是将Sql Profiler附加到它,然后针对结果执行索引调整向导。

如果您想采用更加严格的分类方法,您可以限制探查器仅记录完成时间超过x秒的查询,无论您认为x应该是什么。如果没有任何显示,我通常从5开始,然后从那里开始工作。 Here是该主题的入门读物。

识别长时间运行的查询后,在本地副本中执行它们并检查执行计划。 Here是这方面的入门读物,但要开始寻找“表扫描”。

最终,您的数据库不是最理想的,或者您的硬件不符合流量。这几乎可以肯定是第一个,这两种方法应该让你顺利。

答案 1 :(得分:0)

听起来像是漏洞行为。在不知道你的一般架构的情况下,我不能说出什么样的泄漏,但我可能会建议查看你所有的表,看看是否有任何东西似乎比你期望的更多行。

您也可以在SQL Management Studio中手动运行您的sprocs,看看哪些花了很长时间 - 也许您正在运行一个算法,其运行时间会随着正常运行时间而增加。