2

在閱讀之前,請注意,我已經搜索了這一點,並閱讀了大量關於SO和其他地方的文章,但迄今爲止還沒有任何建議工作。MVC 3/EF/SQL Server奇怪的連接超時問題

我正在隨機獲取登錄到我的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服務器驗證
  • 集成安全性(我甚至給每個可能的帳戶完整的數據庫訪問)
  • 在IIS外部運行
  • 在連接字符串中將Connect Timeout設置爲非常高(Connect Timeout = 50000)。 (我沒有在這裏設置Default Command Timeout)
  • 在我的實體連接上將CommandTimeout設置爲0,5000,100000,無論如何:entities.CommandTieout = 100000;
  • 在使用存儲庫實例的每個使用語句中設置CommandTimeout。
  • 翻轉的SingleOrDefault到FirstOrDefault等
  • 啓用/禁用延遲加載

如果有幫助(爲什麼不呢?):

  • 我使用的是自定義角色和會員供應商。
  • 我只是一個使用語句中從我的控制器撥打電話(AccountRepository的Bleh =新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) 
+0

數據庫服務器與網絡服務器有關,可能你有網絡問題 – 2012-01-30 18:31:25

+2

你可以通過設置一個SQL Server Profiler來檢查數據庫服務器的問題嗎? – DOK 2012-01-30 18:31:57

+0

Ben - 我目前在我的開發機器上直接運行SQL Server 2008。 DOK - 我會檢查一下...我不太熟悉分析器,但會研究它。 – S9Designs 2012-01-30 18:33:38

回答

0

編輯:雖然這的確幫助我,這是不是解決辦法。任何人在未來閱讀時仍然存在這個問題。

只是爲了讓大家知道 - 我相信我發現了這個問題。通過SQL Profiler,我看到用於訪問SQL的帳戶實際上是本地系統帳戶。然後我意識到,爲了嘗試解決問題,我已將ASP.NET v4.0應用程序池更改爲使用本地系統帳戶。我去了,並將身份改回到'ApplicationPoolIdentity',將IIS APPPOOL \ ASP.NET v4.0用戶添加到數據庫中,到目前爲止,一切都很順利。 @DOK - 非常感謝SQL Profiler的信息,它非常有幫助!謝謝其他人!