前几天我注意到我的网络应用程序给了我一个异常超时的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)
答案 0 :(得分:5)
嗯,首先,它是导致问题的近端功能“UpdateHitCounter”,但你不知道这是一个原因还是一个效果。您的查询超出了分配完成的配置时间。
每当您的数据库性能不佳时,您可以运行的广泛笔划方法是将Sql Profiler附加到它,然后针对结果执行索引调整向导。
如果您想采用更加严格的分类方法,您可以限制探查器仅记录完成时间超过x秒的查询,无论您认为x应该是什么。如果没有任何显示,我通常从5开始,然后从那里开始工作。 Here是该主题的入门读物。
识别长时间运行的查询后,在本地副本中执行它们并检查执行计划。 Here是这方面的入门读物,但要开始寻找“表扫描”。
最终,您的数据库不是最理想的,或者您的硬件不符合流量。这几乎可以肯定是第一个,这两种方法应该让你顺利。
答案 1 :(得分:0)
听起来像是漏洞行为。在不知道你的一般架构的情况下,我不能说出什么样的泄漏,但我可能会建议查看你所有的表,看看是否有任何东西似乎比你期望的更多行。
您也可以在SQL Management Studio中手动运行您的sprocs,看看哪些花了很长时间 - 也许您正在运行一个算法,其运行时间会随着正常运行时间而增加。