MVC 3 / EF / SQL Server奇怪的连接超时问题

时间:2012-01-30 18:28:29

标签: sql-server model-view-controller exception timeout repository

在阅读之前请注意我已经搜索了这篇并阅读了大量关于SO和其他地方的文章,目前还没有任何建议。

我在登录我的MVC 3应用程序时随机收到超时错误。它发生在超过一半的时间 - 所有其他时间应用程序登录就好了。如果它不起作用,它会尝试大约10秒然后错误。

错误:

异常:“执行命令定义时发生错误。有关详细信息,请参阅内部异常。” 内部异常:{“超时已到期。在操作完成之前已经过了超时时间,或者服务器没有响应。\ r \ n时间已过期。在操作完成之前已经过了超时时间,或者服务器没有响应。”}

这发生在我的存储库类中,它直接与实体框架交互。


登录时只需从数据库中快速检查,例如:

 return entities.Users.SingleOrDefault(user => user.UserName == userName);

 return (entities.Users.SingleOrDefault(u => u.UserId == user.UserId || u.UserName == user.UserName) != null);

我尝试过的事情:

  • SQL Server验证
  • 集成安全性(我甚至为每个可能的帐户提供了完整的数据库访问权限)
  • 在IIS之外运行
  • 在连接字符串中将连接超时设置得非常高(连接超时= 50000)。 (我这里没有设置默认命令超时)
  • 在我的实体连接上将CommandTimeout设置为0,5000,100000,无论如何:entities.CommandTieout = 100000;
  • 在我使用存储库实例的每个using语句中设置CommandTimeout。
  • 将SingleOrDefault翻转为FirstOrDefault等。
  • 启用/禁用延迟加载(为什么不?)

如果有帮助:

  • 我正在使用自定义角色和成员资格提供程序。
  • 我只是在using语句中调用我的控制器(AccountRepository bleh = new AccountRepository()),而AccountRepository实现了IDisposable等。
  • 实体模型位于单独的项目中。
  • 我正在IIS中运行该网站。它使用4.0集成应用程序池进行设置。
  • 所有帐户都拥有完整的数据库访问权限。
  • 当错误发生时,只要我在web配置(我认为是50000)或存储库中的commandtimeout中设置了它就不会占用。
  • 在登录时没有做太多工作,只是验证用户,获取用户角色然后加载一些少量数据,但在登录时获取用户数据时总会出现错误。
  • 当我在调试之外尝试它时,它会重复错误四到五次(关闭自定义错误)。

以下是事件日志的完整例外:

Exception information: 
Exception type: SqlException 
Exception message: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
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.TdsParser.ThrowExceptionAndWarning()
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.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)

2 个答案:

答案 0 :(得分:2)

您可以通过设置 SQL Server Profiler 来检查数据库服务器中的问题。

您可以通过Google搜索找到有关SQL Profiler的大量信息。这是一个site with a video that might help you get started.

答案 1 :(得分:0)

编辑:虽然这确实对我有帮助,但这不是解决方案。对于将来阅读的人来说,问题仍然存在。

只是为了让每个人都知道 - 我相信我已经找到了这个问题。通过SQL事件探查器,我看到用于访问SQL的帐户实际上是本地系统帐户。然后我意识到,为了尝试先修复问题,我更改了ASP.NET v4.0应用程序池以使用本地系统帐户。我去了将Identity更改回'ApplicationPoolIdentity',将IIS APPPOOL \ ASP.NET v4.0用户添加到数据库中,到目前为止一切都运行良好。 @DOK - 非常感谢有关SQL事件探查器的信息,它帮助极大!还要感谢其他人!