我最近将我的ASP.Net MVC 3 Web应用程序(实体框架4.1 for Data Persistence)发布到实时服务器。该应用程序位于一个Web服务器上,数据库(SQL Server 2008)位于另一个单独的服务器上。
该网站只有几天的点击次数很少,因此,数据库表格中包含的记录非常少(最多10-20个)。
我也有ELMAH(用于ASP.NET的错误记录模块和处理程序)集成到站点中,我已收到以下错误的一些实例
System.Data.SqlClient.SqlException:超时已过期。超时 在完成操作或服务器之前经过的时间段 没有回应。
下面显示了ELMAH提供的完整详细信息
System.Data.EntityException:基础提供程序在Open上失败。 ---> System.Data.SqlClient.SqlException:超时已过期。在完成操作或服务器之前经过的超时时间 没有回应。在 System.Data.SqlClient.SqlInternalConnection.OnError(SQLEXCEPTION exception,Boolean breakConnection)at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32错误)at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult,TdsParserStateObject stateObj)at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(布尔 encrypt,Boolean trustServerCert,Boolean& marsCapable)at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler,Boolean ignoreSniOpenTimeout, Int64 timerExpire,布尔加密,布尔值trustServerCert,布尔值 integratedSecurity) System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,String newPassword,Boolean ignoreSniOpenTimeout, TimeoutTimer超时,SqlConnection owningObject)at System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(布尔 useFailoverHost,ServerInfo primaryServerInfo,String failoverHost, String newPassword,Boolean redirectedUserInstance,SqlConnection owningObject,SqlConnectionString connectionOptions,TimeoutTimer 超时)at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(的SqlConnection owningObject,TimeoutTimer超时,SqlConnectionString connectionOptions,String newPassword,Boolean redirectedUserInstance) 在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity,SqlConnectionString connectionOptions,Object providerInfo, String newPassword,SqlConnection owningObject,Boolean redirectedUserInstance)at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options,Object poolGroupProviderInfo,DbConnectionPool池, DbConnection owningConnection)at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(的DbConnection owningConnection,DbConnectionPool池,DbConnectionOptions选项) 在System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection 拥有对象) System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(的DbConnection 拥有对象) System.Data.ProviderBase.DbConnectionPool.GetConnection(的DbConnection 拥有对象) System.Data.ProviderBase.DbConnectionFactory.GetConnection(的DbConnection 拥有连接) System.Data.ProviderBase.DbConnectionClosed.OpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory)at System.Data.SqlClient.SqlConnection.Open()at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(布尔 openCondition,DbConnection storeConnectionToOpen,DbConnection originalConnection,String exceptionCode,String attemptsOperation, 布尔和放大器; closeStoreConnectionOnFailure)---内部异常结束 堆栈跟踪--- at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(布尔 openCondition,DbConnection storeConnectionToOpen,DbConnection originalConnection,String exceptionCode,String attemptsOperation, 布尔和放大器; closeStoreConnectionOnFailure)at System.Data.EntityClient.EntityConnection.Open()at System.Data.Objects.ObjectContext.EnsureConnection()at System.Data.Objects.ObjectQuery
1.GetResults(Nullable
1 forMergeOption)at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List
1..ctor(IEnumerable1 collection)
1 source) System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary
at System.Linq.Enumerable.ToList[TSource](IEnumerable2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 参数)at System.Web.Mvc.ControllerActionInvoker&LT;&GT; C_ DisplayClass15.b _12() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter,ActionExecutingContext preContext,Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList
1个过滤器,ActionDescriptor actionDescriptor, IDictionary`2参数)at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)
发生此错误的时间是由SELECT查询引起的。这些选择查询非常简单,即
从表格中选择col1,col2,col3,其中col1 = 1
正如我所说的那样,数据库中的数据非常少,因此查询不会回收100条记录。
我使用 Internet 和 Stackoverflow 对此进行了一些研究。有些人建议增加 dbContext CommandTimeout 属性,但是,我不明白为什么我需要这样做。是的,如果我撤回了大量记录,但正如我所说,这些是简单的 SELECT 语句,最多可以撤回1-5条记录。
我也知道开发人员需要密切关注实体框架生成的SQL,因此,我下载并运行了此试用版http://www.datawizard.com,以便了解为实体创建的SQL导致问题的框架SELECT查询。同样,分析器显示这些查询是非常简单的语法,所以我不认为这是问题。
我开始认为它可能与我的数据库和Web应用程序在不同的服务器上有关,但是,我没有想法!
如果有人可以帮助或就此问题向我提出建议,我们将不胜感激。
谢谢大家。