SQL Server 2008超时过期

我问了Stackoverflow下面的问题没有任何答案,但是,有人build议我问serverfault上的问题也。 希望有人能帮助。

我最近将ASP.Net MVC 3 Web应用程序(用于数据持久性的entity framework4.1)发布到实时服务器。 该应用程序位于一个Web服务器上,而数据库(SQL Server 2008)位于另一个单独的服务器上。

这个网站只用了几天的时间,只有很less的命中,因此数据库表中包含的logging很less(最多10-20个)。

我也有ELMAH(错误logging模块和处理程序的ASP.NET)集成到网站,我已收到以下错误的几个实例

System.Data.SqlClient.SqlException:超时过期。 操作完成之前超时的时间或服务器没有响应。

下面显示了由ELMAH提供的全部细节

System.Data.EntityException:底层提供程序在打开时失败。 —> System.Data.SqlClient.SqlException:超时过期。 操作完成之前超时的时间或服务器没有响应。 在System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32错误)System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()System.Data.SqlClient.SqlInternalConnection.OnError(SqlExceptionexception,布尔breakConnection) .SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult,TdsParserStateObject stateObj)在System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()在System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(布尔encryption,布尔trustServerCert,布尔&marsCapable)在System.Data。 SqlClient.TdsParser.Connect(ServerInfo serverInfo,SqlInternalConnectionTds connHandler,布尔ignoreSniOpenTimeout,Int64计时器展开,布尔encryption,布尔trustServerCert,布尔integratedSecurity)在System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,stringnewPassword,布尔ignoreSniOpenTimeout,TimeoutTimer超时, SqlConnection拥有对象)在System.Data.S (SqlConnection拥有对象,超时计时器超时,SqlConnectionString连接选项,SQL Server数据库连接选项),qlClient.SqlInternalConnectionTds.LoginWithFailover(布尔useFailoverHost,ServerInfo primaryServerInfo,stringfailoverHost,stringnewPassword,布尔redirectedUserInstance,SqlConnection拥有对象,SqlConnectionString连接选项,TimeoutTimer超时)在System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions选项,System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity身份,SqlConnectionString connectionOptions,对象providerInfo,stringnewPassword,SqlConnection拥有对象,布尔redirectedUserInstance)stringnewPassword,布尔redirectedUserInstance)对象poolGroupProviderInfo,DbConnectionPool池,DbConnection拥有连接)在System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection,DbConnectionPoo (DbConnection拥有对象)在System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection拥有对象)在System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection拥有对象)System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection拥有对象) .Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)在System.Data.SqlClient.SqlConnection.Open()在System.Data.EntityClient.EntityConnection。 OpenStoreConnectionIf(布尔openCondition,DbConnection storeConnectionToOpen,DbConnection originalConnection,stringexceptionCode,string企图操作,布尔和closeStoreConnectionOnFailure)—结束内部exception堆栈跟踪—在System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(布尔openCondition,DbConnection storeConnectionToOpen,DbConnection要么 在System.Data.EntityClient.EntityConnection.Open()在System.Data.Objects.ObjectContext.EnsureConnection()在System.Data.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption 1.GetResults(Nullable iginalOption,String exceptionCode,String attemptedOperation,Boolean&closeStoreConnectionOnFailure) )在System.Data.Objects.ObjectQuery 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 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)在System.Web.Mvc.ControllerActionInvoker。System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器,ActionExecutingContext preContext,Func 1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList c__DisplayClass15.b__12( 1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList 1 filters,ActionDescriptor actionDescriptor,IDictionary`2 parameters)在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)

发生此错误的场合是由于SELECT查询造成的。 这些select查询非常简单,

从col1 = 1的表中selectcol1,col2,col3

正如我所说的那样,数据库中的数据非常less,所以不像查询是否拉回了100多条logging。

我已经做了一些使用InternetStackoverflow的研究 。 有人build议增加dbContext的CommandTimeout属性,但是,我不明白为什么我需要这样做。 是的,如果我正在回收大量的logging,但正如我所说的那样,这些是简单的SELECT语句,最多可以取回1-5条logging。

我也知道开发人员需要关注由Entity Framework生成的SQL,所以我下载并运行了这个试用版http://www.datawizard.com ,以便查看为entity frameworkSELECT引起问题的查询。 再说一次,分析器显示这些查询是非常简单的语法,所以我不认为这是问题。

我开始想,也许这与我的数据库和Web应用程序在单独的服务器上有关,但是,我没有想法!

请任何人都可以帮助或build议我与这个问题,这将不胜感激。

感谢大家。

要消除客户端或networking问题,请在启用了客户端统计信息的pipe理工作室中运行生成的SQL,并观察执行查询所需的运行时间和工作量。

你可以按照GO的SELECT查询连续执行任意次,所以你可以得到一个有意义的样本集的平均值:

 SELECT col1, col2, col3 FROM table WHERE something GO 1000 

还要考虑到,由于这样的框架隐藏了大部分的实际SQL,如果不是这样的话,这可能不是真正的问题。 也许它试图大规模并行化查询,或者由于涉及ORM,它在表上保留一个硬(独占读写)锁。

从你提供的stacktrace,这不是一个命令超时,而是一个连接超时 (有这样的行: System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...) )。 这可能是VS 2010中的一个已知错误,如果您正在使用镜像,请参阅此博客文章以获取更多信息 。