2009-08-18 26 views
0

私は常にこのデータベースがタイムアウトするのはなぜですか?

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
Generated: Tue, 18 Aug 2009 08:05:39 GMT 

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Data.SqlClient.SqlException: 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.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    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.Common.DbCommand.ExecuteReader() 
    at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at System.Data.Linq.Provider.BindingList.Create[T](DataContext context, IEnumerable`1 sequence) 
    at System.Data.Linq.DataQuery`1.GetNewBindingList() 
    at System.Data.Linq.DataQuery`1.System.ComponentModel.IListSource.GetList() 
    at System.Windows.Forms.CurrencyManager.SetDataSource(Object dataSource) 
    at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember) 
    at System.Windows.Forms.BindingContext.get_Item(Object dataSource) 
    at PlexityHide.GTP.TimeItemDataConnect.Wire() 
    at PlexityHide.GTP.TimeItemDataConnect.UpdateDataSource(IListSource aDataSource, String aDataMember, Layer aLayer) 
    at PlexityHide.GTP.TimeItemDataConnect.set_DataSource(Object value) 
    at PlexityHide.GTP.Layer.set_DataSource(Object value) 
    at WebSchedule._Default.Grid_OnEachListItemWhenDataBound_GridNode(Object GTPComponent, EachListItemWhenDataBoundArgs e) in C:\MyDev\WebSchedule\Schedule.aspx.cs:line 503 
    at PlexityHide.GTP.Grid.NodeChangedInDS(GridNode aNode) 
    at PlexityHide.GTP.NodeDataConnect.UpdateRowContent(Int32 index) 
    at PlexityHide.GTP.NodeDataConnect.EnsureBindUpToDate() 
    at PlexityHide.GTP.GridNodes.get_Count() 
    at PlexityHide.GTP.GridStructure.get_FirstVisibleNode() 
    at PlexityHide.GTP.Gantt.set_TurnOffAllCollisionDetect(Boolean value) 
    at PlexityHide.GTP.WEB.Gantt_ASP.OnPreRender(EventArgs e) 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.BasePartialCachingControl.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Control.PreRenderRecursiveInternal() 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    --- End of inner exception stack trace --- 
    at System.Web.UI.Page.HandleError(Exception e) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest() 
    at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) 
    at System.Web.UI.Page.ProcessRequest(HttpContext context) 
    at ASP.schedule_aspx.ProcessRequest(HttpContext context) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\13c4fe72\f906a8a8\App_Web_schedule.aspx.cdcab7d2.nhap4sin.0.cs:line 0 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

を取得し、データベースイムへのクエリを実行すると、それが誰の時点でデータベースに行くされている接続の数によって引き起こされるだろうか? 問題のページはガントチャートを呼び出し、特定の契約ごとにスケジュールテーブルのデータを入力します。起こっていることは、同時に10人の人がテーブルに電話をかけているときにタイムアウトが発生する場合です。

+0

これは複数のユーザーがいる開発マシンですか? SQL側でこれをプロファイリングしましたか? SQL文がハングアップしたときに実行されるSQL文は何ですか? –

+0

データベース内でデッドロックになっている可能性がありますか、それとも別の例外ですか? – ChrisW

答えて

3

作業にはデフォルトのタイムアウト時間よりも時間がかかります。クエリが遅すぎます。このクエリ、他のすべてのクエリを遅くする、ブロックを更新するクエリ、またはいくつかの理由があります。

0

文章が長すぎます。複数のユーザーだけが起こっている場合は、リソースがフリーズしている可能性のあるロックを探します。可能であれば、 "with(nolock)"を使用してください。

0

クエリアナライザで同じクエリを実行するときにかかる時間を確認します。

クエリプランを見てください。

Profilerを使用して、このストアドプロシージャに複数の接続と時間がかかるかどうかを確認します。

ADO.NETでコマンドのタイムアウトを確認してください。

0

これはクライアントのタイムアウトであるため、データベースが頻繁に使用される(多数の接続/大規模なクエリ)場合、指定された時間内に応答できない場合、クライアントは最終的に例外をスローします。

クエリタイムアウトを切るか、プロファイラを調べてクエリを最適化してください。

9

長期実行クエリが多すぎる可能性があります。もう1つの可能性が高い原因は、接続を終了したらすぐに接続を閉じずに接続プールに解放することです。

一般に、このような状況を避けるには、できるだけ早く接続を取得し、できるだけ早くusingステートメントで解放する必要があります。コネクションを明示的に閉じないと(たとえ例外が発生したとしても)、ガーベジコレクタとファイナライザの慈悲を受けてプールに接続を戻します。

真にに長時間実行クエリを使用するアクティブな接続が多数あると思われる場合は、接続プール内の接続数を増やす必要があります。実際のクエリ自体がタイムアウトしていると思われる場合は、コマンドや接続のタイムアウトを長くする必要があります。

0

あなたのクエリやデータ構造を見ることができない場合、あなたのタイムアウトを引き起こす可能性のあるものだけを推測することができます。ほとんどの場合、クエリは遅くなります。接続のタイムアウト時間を長くすると、タイムアウトの問題が発生する可能性がありますが、通常はクエリを修正するのが最善です。もう1つは、クエリを実行しているテーブルのインデックスです。あなたのクエリに多くのジョインがある場合、インデックスはあなたが参加しているフィールドを組み込む必要があります。

0

私の経験では、ほとんど常にクエリです。

クエリアナライザまたはManagement Studioでクエリを開き、推定実行計画を見つけます。私の経験則では、頻繁に実行されるクエリのコストは1.00未満でなければならないということです。それが2.00を過ぎ始めたら、あなたは問題を見始めるでしょう。 (もちろん、これはいくつかの他の問題があった私のサイトに特有のものでした...)。

クエリコストがすでに低い場合は、プロファイラを実行して、他のコマンドがサーバーにヒットしているかどうかを確認します。その後、これらのクエリの分析を開始して高価なものを探します。

それは一日の特定の時間帯で発生する傾向がある場合は、これらの点を確認してください。

  • は、バックアップ・プロセスの実行されていて、通常よりも長いを取りますか?
  • 実行中のスケジュール済みレポートがブロックされています(不適切なクエリ)?
  • あなたは接続でそれを圧倒していますか?特に、数時間稼働した後は、接続を開いたままにする接続管理のバグが発生する可能性があります。
0

どのような分離レベルを使用していますか?

接続プールを使用していますか?

汚れた読み取りを行う場合は、分離レベルがコミットされていないことを確認してください。

+0

接続プールを使用していません – kevinw

+0

あなたのタイムアウトはどのように設定されていますか? 接続とコマンドの両方を確認してください http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx http://msdn.microsoft.com/en-us/ライブラリ/ system.data.sqlclient.sqlconnection.connectiontimeout.aspx – Keibosh

関連する問題