最近、ASP.Net MVC 3 Webアプリケーション(データ永続性のためのEntity Framework 4.1)をライブサーバーに公開しました。アプリケーションは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例外、ブールブレーク接続)at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj、UInt32 error)at System.Data .SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult、TdsParserStateObject stateObj)at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(ブール暗号化、ブールtrustServerCert、ブール&
1.GetResults(Nullable
1 forMergeOption)at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List
1..ctor(IEnumerable 1 source)System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary 2 parameters)atSystem.Web.Mvc.ControllerActionInvoker。<>c_ DisplayClass15 System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext、String actionName)。1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList
このエラーが発生したのは、SELECTクエリが原因です。これらの選択クエリは非常に単純です。
col1 = 1であるテーブルからcol1、col2、col3を選択します
そして、私が述べたように、データベース内にはデータがほとんどないため、クエリが数百のレコードをプルバックしているわけではありません。
私はインターネットとStackoverflowの両方を使用してこれについていくつかの調査を行いました。dbContext CommandTimeoutプロパティを増やすことを提案する人もいますが、なぜこれを行う必要があるのかわかりません。はい、大量のレコードをプルバックする場合ですが、前述したように、これらは最大で1〜5レコードをプルバックする単純なSELECTステートメントです。
また、開発者はEntity Frameworkによって生成されたSQLを監視する必要があることも知っているので、この試用版http://www.datawizard.comをダウンロードして実行し、問題を引き起こしていたEntityFrameworkSELECTクエリ。繰り返しになりますが、プロファイラーはこれらのクエリが非常に単純な構文であることを示したので、それが問題であるとは思いません。
データベースとWebアプリケーションが別々のサーバー上にあることに関係があるのではないかと思い始めていますが、私は考えがありません。
誰かがこの問題について私を助けたりアドバイスしたりできるなら、それは大いにありがたいです。
みんな、ありがとう。