为什么数据库超时?

时间:2009-08-18 14:08:54

标签: c# sql sql-server

当我对数据库运行查询时,我不断得到这个

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Generated: Tue, 18 Aug 2009 08:05:39 GMT

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> 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.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.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   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)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader()
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at System.Data.Linq.Provider.BindingList.Create[T](DataContext context, IEnumerable`1 sequence)
   at System.Data.Linq.DataQuery`1.GetNewBindingList()
   at System.Data.Linq.DataQuery`1.System.ComponentModel.IListSource.GetList()
   at System.Windows.Forms.CurrencyManager.SetDataSource(Object dataSource)
   at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
   at System.Windows.Forms.BindingContext.get_Item(Object dataSource)
   at PlexityHide.GTP.TimeItemDataConnect.Wire()
   at PlexityHide.GTP.TimeItemDataConnect.UpdateDataSource(IListSource aDataSource, String aDataMember, Layer aLayer)
   at PlexityHide.GTP.TimeItemDataConnect.set_DataSource(Object value)
   at PlexityHide.GTP.Layer.set_DataSource(Object value)
   at WebSchedule._Default.Grid_OnEachListItemWhenDataBound_GridNode(Object GTPComponent, EachListItemWhenDataBoundArgs e) in C:\MyDev\WebSchedule\Schedule.aspx.cs:line 503
   at PlexityHide.GTP.Grid.NodeChangedInDS(GridNode aNode)
   at PlexityHide.GTP.NodeDataConnect.UpdateRowContent(Int32 index)
   at PlexityHide.GTP.NodeDataConnect.EnsureBindUpToDate()
   at PlexityHide.GTP.GridNodes.get_Count()
   at PlexityHide.GTP.GridStructure.get_FirstVisibleNode()
   at PlexityHide.GTP.Gantt.set_TurnOffAllCollisionDetect(Boolean value)
   at PlexityHide.GTP.WEB.Gantt_ASP.OnPreRender(EventArgs e)
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.BasePartialCachingControl.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   --- End of inner exception stack trace ---
   at System.Web.UI.Page.HandleError(Exception e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.schedule_aspx.ProcessRequest(HttpContext context) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\13c4fe72\f906a8a8\App_Web_schedule.aspx.cdcab7d2.nhap4sin.0.cs:line 0
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

是否可能是由于任何时候进入数据库的连接数造成的? 有问题的页面调用甘特图并使用特定合同的计划表中的数据填充它。而且正在发生的事情是,如果说有10个人同时拨打电话,我会发生超时

8 个答案:

答案 0 :(得分:11)

你可能有太多长时间运行的查询。另一个非常可能的原因是,一旦完成连接,就不会关闭连接,这会将连接释放到连接池。

通常,您应该尽可能晚地获取连接,并使用using语句尽早释放它们,以避免这种情况。如果你没有明确地关闭连接(即使面对异常),你也会把自己置于垃圾收集器和终结器的支配下,以便将连接返回到池中。

如果您认为真正与长时间运行的查询有许多活动连接,则应增加连接池中的连接数。如果您认为实际查询本身超时(即花费的时间超过您允许的时间),那么您应该增加命令或连接的超时。

答案 1 :(得分:4)

您尝试的工作所需时间超过默认超时时间。您的查询运行速度太慢。它可能是这个查询,另一个查询减慢了其他所有人的速度,更新了阻止,或者有很多原因。

答案 2 :(得分:0)

可能你的陈述花了太长时间。如果只发生在多个用户身上,请寻找可能冻结资源的锁定。如果可能,请使用“with(nolock)”。

答案 3 :(得分:0)

检查在查询分析器中运行相同查询所需的时间。

查看查询计划。

使用Profiler检查此存储过程中是否存在多个连接和时间。

在ADO.NET中检查命令超时。

答案 4 :(得分:0)

这是客户端超时,因此如果数据库被大量使用(许多连接/大型查询)并且无法在指定的时间内响应,则客户端最终会抛出异常。

尝试切换查询超时,或查看Profiler以优化查询。

答案 5 :(得分:0)

无法查看您的查询或数据结构,我们只能提供可能导致您超时的猜测。在大多数情况下,查询会变慢。增加连接的超时时间可以解决超时问题,但通常最好修复查询。另一件要看的是您的查询所针对的表的索引。如果您的查询中有很多连接,那么您的索引应该包含您要加入的字段。

答案 6 :(得分:0)

根据我的经验,它几乎总是查询。

在查询分析器或Management Studio中打开查询,找到估计的执行计划。我的经验法则是,经常执行的查询的成本应小于1.00。如果它开始超过2.00,你会开始看到问题。 (当然,这特定于我的网站,其中还有其他一些问题......)。

如果查询成本已经很低,请运行Profiler以查看其他命令是否正在命中服务器。然后开始分析这些查询以找到昂贵的查询。

如果它在某一天的特定时间发生,请查看以下内容:

  • 备份过程是否正常运行并且耗时超过正常时间?
  • 是否有正在运行的计划报告阻止(错误查询)?
  • 你是否用连接来压倒它?特别是在运行几个小时之后,您可能会在连接管理方面遇到错误,您可以在此处打开连接。

答案 7 :(得分:0)

您使用的隔离级别是什么?

您使用的是连接池吗?

如果可以进行脏读,请确保您的隔离级别是uncommited read。