私は、ASP.NET Webページページを実行しています。このページは、初期読み込み時にSQLサーバーからアイテムのリストを取得します。このクエリは1秒ほどで実行され、2秒以内にページを読み込みます。返品は、約1000レコード(ギブまたはテイク)です。 Service Manager SQLデータベースから他の情報とともにホスト名を取得しています。
このページ内には、本質的にまったく同じクエリを実行するが、ホスト名に基づいてLIKEを使用して実行する検索が組み込まれています。これにより、検索クエリの一部を含むすべてのホスト名で同じページがロードされます。通常、クエリは1秒以内にSQL Management Studio内で実行されますが、ページの読み込みにはかなり時間がかかり、タイムアウトすることもあります。
私の質問は、なぜパラメーターベースの検索に時間がかかり、明らかな理由もなくタイムアウトすることがあるのかということです。このタイムアウトを緩和するために実行できる手順はありますか?以下は完全なエラーです。
「/」アプリケーションのサーバーエラー
The wait operation timed out
説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーの詳細とコードのどこで発生したかについては、スタックトレースを確認してください。
例外の詳細:
System.ComponentModel.Win32Exception: The wait operation timed out
Source Error:
Line 13: }
Line 14:
Line 15: var selectedData = db.Query(selectCommand, searchTerm);
Line 16:
Line 17:
Source File: c:\Users\u0149920\Documents\My Web Sites\AppSupport\servers\default.cshtml Line: 15
スタックトレース:
[Win32Exception (0x80004005): The wait operation timed out]
[SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1753346
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5295154
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1682
System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +59
System.Data.SqlClient.SqlDataReader.get_MetaData() +90
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1325
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
System.Data.Common.DbCommand.ExecuteReader() +12
WebMatrix.Data.<QueryInternal>d__0.MoveNext() +152
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381
System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
WebMatrix.Data.Database.Query(String commandText, Object[] parameters) +103
ASP._Page_servers_default_cshtml.Execute() in c:\Users\u0149920\Documents\My Web Sites\AppSupport\servers\default.cshtml:15
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197
System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors) +69
System.Web.WebPages.WebPage.ExecutePageHierarchy() +151
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76
System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext) +114
バージョン情報:Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929
あなたが抱えている問題は、クエリコマンドに時間がかかりすぎていることです。クエリを実行するデフォルトのタイムアウトは15秒だと思います。コマンドが実行を完了するのに十分な長さになるように、CommandTimeout(秒単位)を設定する必要があります。 「CommandTimeout」は、接続文字列の「接続タイムアウト」とは異なり、コマンドごとに設定する必要があります。
Sql Selecting Eventで、次のコマンドを使用します。
e.Command.CommandTimeout = 60
例えば:
Protected Sub SqlDataSource1_Selecting(sender As Object, e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs)
e.Command.CommandTimeout = 60
End Sub
私よりも多くのことを知っているすべての人に、それを役に立たなかったり誤解を招くようにマークするのではなく、もう一度読んでください。ロックされたスレッドによってすべてのリソースが消費されるため、仮想マシン(VM)が応答しなくなるという問題があったため、スレッドを強制終了することが唯一の選択肢でした。長いクエリを実行している人にはこれをお勧めしませんが、応答しないVMまたは何かで立ち往生している人には役立つかもしれません。その最大の個人が電話に出ます。はい、クエリを強制終了しますが、VMマシンが破壊されるのを防ぎました。
Serverstackはすでに同様の質問に回答しました。 VMマシン上のSQLに関する私の問題を解決しました。 こちら を確認してください
インデックスの問題を修正するには、次のコマンドを実行する必要があります。
exec sp_updatestats
Entity Frameworkを使用している場合、次の操作を行うことで、デフォルトのタイムアウトを延長できます(長時間実行されるクエリの完了までの時間を長くするため)。
myDbContext.Database.CommandTimeout = 300;
ここで、myDbContext
はDbContextインスタンスであり、300
は秒単位のタイムアウト値です。
(Entity Framework 6現在の構文)
同じ問題がありました。 exec sp_updatestats
を実行すると動作することもありましたが、常にではありませんでした。クエリを高速化するために、クエリでNOLOCK
ステートメントを使用することにしました。 FROM句の後にNOLOCK
を追加するだけです。例:
SELECT clicks.entryURL, clicks.entryTime, sessions.userID
FROM sessions, clicks WITH (NOLOCK)
WHERE sessions.sessionID = clicks.sessionID AND clicks.entryTime > DATEADD(day, -1, GETDATE())
記事全文を読む こちら 。
データベースのインデックス再作成テーブルを調べます。
断片化レベルを最初に調べることができます-10%を超えている場合は、インデックスを再作成することでメリットが得られます。それが非常に高い場合、これは重要なパフォーマンスのボトルネックを作り出している可能性があります。
これは定期的に行う必要があります。
ここで他の回答と他のいくつかの回答を試しました。 SQLサービスを停止して再起動しました。何も機能しませんでした。
ただし、コンピューターの再起動は機能しました。
このエラーは、ローカル開発用の以前の接続文字列の一部にData Source =。/が含まれていた2008 SQL Serverから2014 SQL Serverへのアップグレード後に発生しました
<add name="MyLocalDatabase" connectionString="Data Source=./;Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/>
これを./から(ローカル)またはlocalhostに変更すると、問題が修正されました。
<add name="MyLocalDatabase" connectionString="Data Source=(local);Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/>
テーブルにプライマリキーがなかったため、タイムアウトエラーが発生しました。キーを設定した後sloved。
この問題は、sqlcommandの実行時間により発生します。 CommandTimeout = 100または要求値を設定します
秒単位のタイムアウト値@注最適な値を提供する方が良い