SQL Server 2008-Timeout abgelaufen

SQL Server 2008-Timeout abgelaufen

Ich habe die folgende Frage auf Stackoverflow gestellt, ohne eine Antwort zu erhalten, aber jemand hat mir vorgeschlagen, die Frage auch auf Serverfault zu stellen. Hoffentlich kann jemand helfen.

Ich habe vor Kurzem meine ASP.Net MVC 3-Webanwendung (Entity Framework 4.1 für Datenpersistenz) auf einem Live-Server veröffentlicht. Die Anwendung befindet sich auf einem Webserver und die Datenbank (SQL Server 2008) auf einem anderen separaten Server.

Die Site ist erst seit wenigen Tagen online und hat nur sehr wenige Zugriffe. Aus diesem Grund sind in den Datenbanktabellen nur sehr wenige Datensätze enthalten (max. 10 – 20).

Ich habe auch ELMAH (Error Logging Modules and Handlers for ASP.NET) in die Site integriert und habe bereits einige Instanzen des folgenden Fehlers erhalten

System.Data.SqlClient.SqlException: Timeout abgelaufen. Das Timeout ist vor Abschluss des Vorgangs abgelaufen oder der Server antwortet nicht.

Nachfolgend sind alle von ELMAH bereitgestellten Details aufgeführt.

System.Data.EntityException: Beim Öffnen des zugrunde liegenden Anbieters ist ein Fehler aufgetreten. ---> System.Data.SqlClient.SqlException: Timeout abgelaufen. Die Timeout-Periode ist vor Abschluss des Vorgangs abgelaufen oder der Server antwortet nicht. bei System.Data.SqlClient.SqlInternalConnection.OnError (SqlException-Ausnahme, Boolean breakConnection) bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() bei System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject stateObj, UInt32-Fehler) bei System.Data.SqlClient.TdsParserStateObject.ReadSni (DbAsyncResult asyncResult, TdsParserStateObject stateObj) bei System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() bei System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake (Boolesche Verschlüsselung, Boolean trustServerCert, Boolean& marsCapable) bei System.Data.SqlClient.TdsParser.Connect (ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity) bei System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer Timeout, SqlConnection besitzendesObjekt) bei System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost, ServerInfo primaryServerInfo, String failoverHost, String newPassword, Boolean redirectedUserInstance, SqlConnection besitzendesObjekt, SqlConnectionString connectionOptions, TimeoutTimer Timeout) bei System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection besitzendesObjekt, TimeoutTimer-Timeout, SqlConnectionString Verbindungsoptionen, String neues Kennwort, Boolean umgeleiteteBenutzerinstanz) bei System.Data.SqlClient.SqlInternalConnectionTds..ctor (DbConnectionPoolIdentity Identität, SqlConnectionString Verbindungsoptionen, Objektproviderinfo, String neues Kennwort, SqlConnection besitzendes Objekt, Boolean umgeleiteteBenutzerinstanz) bei System.Data.SqlClient.SqlConnectionFactory.CreateConnection (DbConnectionOptions Optionen, ObjektpoolGroupProviderInfo, DbConnectionPool Pool, DbConnection besitzendeVerbindung) bei System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (DbConnection besitzendeVerbindung, DbConnectionPool Pool, DbConnectionOptions Optionen) bei System.Data.ProviderBase.DbConnectionPool.CreateObject (DbConnection besitzendes Objekt) bei System.Data.ProviderBase.DbConnectionPool.UserCreateRequest (DbConnection-Besitzerobjekt) bei System.Data.ProviderBase.DbConnectionPool.GetConnection (DbConnection-Besitzerobjekt) bei System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection-Besitzerverbindung) bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection-Außenverbindung, DbConnectionFactory-VerbindungsFactory) bei System.Data.SqlClient.SqlConnection.Open() bei System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) --- Ende des inneren Ausnahmestapeltraces --- bei System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) bei System.Data.EntityClient.EntityConnection.Open() bei System.Data.Objects.ObjectContext.EnsureConnection() bei System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) bei System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor(IEnumerable 1 Quelle) System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext, IDictionary 2 Parameter) bei System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.b__12() bei System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter Filter, ActionExecutingContext PreContext, Func 1 Filter, ActionDescriptor ActionDescriptor, IDictionary`2 Parameter) bei System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext, String ActionName)1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList

Die Fälle, in denen dieser Fehler auftrat, waren auf SELECT-Abfragen zurückzuführen. Diese Select-Abfragen sind sehr einfach, d. h.

Wählen Sie col1, col2, col3 aus der Tabelle, wobei col1 = 1

Und wie ich bereits sagte, sind in der Datenbank nur sehr wenige Daten vorhanden, es ist also nicht so, dass die Abfragen Hunderte von Datensätzen abrufen.

Ich habe einige Nachforschungen hierzu angestellt, und zwar sowohl mitInternetUndPaketüberfluss. Einige Leute schlagen vor, diedbContext-BefehlstimeoutProperty, aber ich verstehe nicht, warum ich das tun muss. Ja, wenn ich eine Menge Datensätze zurückziehen würde, aber wie gesagt, das sind einfacheWÄHLENAnweisungen, die höchstens 1–5 Datensätze zurückverfolgen.

Ich weiß auch, dass Entwickler ein Auge auf das vom Entity Framework generierte SQL haben müssen, also habe ich diese Testversion heruntergeladen und ausgeführthttp://www.datawizard.comum einen Blick auf das SQL zu werfen, das für die Entity Framework SELECT-Abfragen erstellt wurde, die ein Problem verursachten. Auch hier zeigte der Profiler, dass diese Abfragen eine sehr einfache Syntax aufweisen, daher glaube ich nicht, dass dies das Problem ist.

Ich fange an zu glauben, dass es vielleicht etwas damit zu tun hat, dass meine Datenbank und meine Webanwendung auf unterschiedlichen Servern liegen, aber mir fallen keine Ideen mehr ein!

Ich wäre sehr dankbar, wenn mir jemand bei diesem Problem helfen oder einen Rat geben könnte.

Vielen Dank an alle.

Antwort1

Um Client- oder Netzwerkprobleme zu vermeiden, führen Sie das resultierende SQL in einem Management Studio mit aktivierten Clientstatistiken aus und beobachten Sie die Laufzeiten und den Aufwand, der zum Ausführen der Abfrage erforderlich ist.

Sie können der SELECT-Abfrage GO folgen lassen, um sie beliebig oft hintereinander auszuführen und so einen Durchschnitt über einen aussagekräftigen Stichprobensatz zu erhalten:

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

Bedenken Sie auch, dass ein solches Framework einen Großteil, wenn nicht den größten Teil des eigentlichen SQL verbirgt, sodass dies möglicherweise nicht das eigentliche Problem ist. Vielleicht versucht es, die Abfrage massiv zu parallelisieren, oder es verfügt aufgrund des beteiligten ORM über eine harte (exklusive Lese-/Schreib-)Sperre für die Tabelle(n).

Antwort2

Aus dem von Ihnen bereitgestellten Stacktrace geht hervor, dass es sich nicht um ein Befehlstimeout handelt, sondern um einVerbindungszeitüberschreitung(es gibt diese Zeile: System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...)). Dies könnte ein bekannter Fehler in VS 2010 sein. Wenn Sie Spiegelung verwenden, lesen Siediesen Blogbeitrag für weitere Informationen.

verwandte Informationen