SQL Server 2008 タイムアウトが期限切れになりました

SQL Server 2008 タイムアウトが期限切れになりました

Stackoverflow で以下の質問をしましたが、回答はありませんでした。しかし、誰かが serverfault でも質問することを提案してくれました。誰かが助けてくれることを願っています。

最近、ASP.Net MVC 3 Web アプリケーション (Entity Framework 4.1 for Data Persistence) をライブ サーバーに公開しました。アプリケーションは 1 つの 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)、System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()、System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)、System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)、System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()、System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean& marsCapable)、System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds) connHandler、Boolean ignoreSniOpenTimeout、Int64 timerExpire、Boolean encrypt、Boolean trustServerCert、Boolean integratedSecurity)、System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo、String newPassword、Boolean ignoreSniOpenTimeout、TimeoutTimer timeout、SqlConnection owningObject)、System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost、ServerInfo primaryServerInfo、String failedHost、String newPassword、Boolean redirectedUserInstance、SqlConnection owningObject、SqlConnectionString connectionOptions、TimeoutTimer timeout)、System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject、TimeoutTimer timeout、SqlConnectionString connectionOptions、String newPassword、Boolean redirectedUserInstance) で System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity、SqlConnectionString connectionOptions、Object providerInfo、String newPassword、SqlConnection owningObject、Boolean redirectedUserInstance) で System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options、Object poolGroupProviderInfo、DbConnectionPool pool、DbConnection owningConnection) で System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection、DbConnectionPool pool、DbConnectionOptions options) で System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) で System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) でSystem.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)、System.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(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) --- 内部例外スタック トレースの終了 --- at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) at System.Data.EntityClient.EntityConnection.Open() at System.Data.Objects.ObjectContext.EnsureConnection() at System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor(IEnumerable 1 ソース) System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary 2 パラメーター) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.b__12() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter フィルター、ActionExecutingContext preContext、Func 1 フィルター、ActionDescriptor actionDescriptor、IDictionary`2 パラメーター) at 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

このエラーが発生するのはSELECTクエリが原因です。これらのSELECTクエリは非常に単純です。

col1 = 1 のテーブルから col1、col2、col3 を選択します。

そして、私が述べたように、データベース内のデータは非常に少ないので、クエリによって数百のレコードが取得されるわけではありません。

私はこれについて、インターネットそしてスタックオーバーフロー。一部の人々は、dbContext コマンドタイムアウト財産については、なぜこれをしなければならないのか理解できません。確かに、大量の記録を引っ張るのであれば、しかし、私が言ったように、これらは単純なものです選択する最大で 1 ~ 5 件のレコードを戻すステートメント。

また、開発者はEntity Frameworkによって生成されたSQLに注意を払う必要があることもわかっているので、この試用版をダウンロードして実行しました。http://www.datawizard.com問題の原因となっている Entity Framework SELECT クエリ用に作成された SQL を確認するためです。 繰り返しになりますが、プロファイラーはこれらのクエリが非常に単純な構文であることを示したので、それが問題ではないと思います。

データベースと Web アプリケーションが別のサーバー上にあることが関係しているのではないかと考え始めていますが、アイデアが浮かびません。

この問題についてどなたか助けていただいたりアドバイスしていただけると大変助かります。

みんな、ありがとう。

答え1

クライアントまたはネットワークの問題を排除するには、クライアント統計を有効にした管理スタジオで結果の SQL を実行し、クエリの実行に必要な実行時間と労力を観察します。

SELECT クエリの後に GO を続けると、任意の回数連続して実行できるため、意味のあるサンプル セットの平均を取得できます。

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

また、このようなフレームワークは実際の SQL のほとんどを非表示にするため、それが実際の問題ではない可能性があることも考慮してください。クエリを大規模に並列化しようとしているか、または ORM が関係しているためにテーブルにハード ロック (排他的読み取り/書き込み) を保持している可能性があります。

答え2

あなたが提供したスタックトレースから、これはコマンドタイムアウトではなく、接続タイムアウト(この行がありますSystem.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...):)。これはVS 2010の既知のバグである可能性があります。ミラーリングを使用している場合は、詳細についてはこのブログ投稿をご覧ください

関連情報