2016-09-06 32 views
0

データベースにアクセスするためにエンティティフレームワーク6を使用します。 開発マシンでは、SQL Server 2014 Expressエディションがあります。 そして、EF6を使用して複雑なクエリを作成するとうまくいきますが、結果が得られます。本番マシン上でデータベースにアクセスするとタイムアウト期限切れのエラーが発生するのはなぜですか?

生産に開発マシンからコードを移動するとき、私は、SQL Server 2012を持っているとクエリが、私はこのエラーを取得解雇:

{"Message":"System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out\r\n at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)\r\n at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)\r\n at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)\r\n at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()\r\n at System.Data.SqlClient.SqlDataReader.get_MetaData()\r\n at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource 1 completion, Int32 timeout, Task& task, Boolean asyncWrite)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)\r\n at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)\r\n at System.Data.Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func 3 operation, TInterceptionContext interceptionContext, Action 3 executing, Action 3 executed)\r\n at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)\r\n at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)\r\nClientConnectionId:4a0350b7-e91e-42a4-ae04-ae94e294c26a\r\nError Number:-2,State:0,Class:11"}

私はそれながら本番マシン上で上記のエラーを取得する理由はすべてのアイデアを開発にはうまくいきますか?

+0

タイムアウトの設定は何ですか?タイムアウトを増やしてみましたか?あなたはそれが完了したかどうかを見るために0 /無制限に設定しようとしましたか? – Tanner

+0

@Tanner、私は接続ストリングで(生産現場ではなく、開発マシーンではない) – Michael

+0

@Michaelタイムアウトを設定していない場合、明示的に設定するのが最も良いデフォルト値があります。私はデフォルトが30秒だと思う。 – Tanner

答えて

1

タイムアウトを次のように増やすことができます。そのようにしてお知らせください。

重要なお知らせ:これは単なる一時的な解決策です。 EFクエリを分析し、そのパフォーマンスを向上させる必要があります。つまり、そのクエリを最適化する必要があります。したがって、開発データベースのデータ量は少なくなりますが、これは発生していません。しかし、大量のデータロード(生産のような)が発生すると、タイムアウトの問題が発生します。ベストソリューションは、EFクエリの最適化です。

注:MSDN: Database.CommandTimeout Property:ここ時間

public DbContext() : base("Default") 
     { 
      this.Database.CommandTimeout = 60; 
     } 

リファレンス秒です。

0

設定を改善するタイムアウト= 0、0は無制限と定義されます。

this.Database.CommandTimeout = 0; 
+0

私は投票の理由を知ることができますか? –

+0

データベース接続で無制限のタイムアウトを設定することを提案しているので、より長いタイムアウトを設定するよりも優れていると言っても、それは総狂気です。これにより、あなたのアプリケーションは、新しい問題の多くを開くようになります。 – CodeCaster

3

壊れたような指がある人は、医者のオフィスに歩いています。 「医者」、彼は言う、「私がここを押すと痛い」。医者は見て、行く「まあ、あまり強く押してもあまり痛くないのですよね?」を呼び出し、その人を家に送ります。

データベースタイムアウトを実行している場合、解決策はNOTであり、単純にタイムアウトを増やすことです。これはあなたがここに来ているという恐ろしいアドバイスです。

クエリを分析してプロファイルし、その分析結果からデータベースとクエリを最適化します。

+0

私は投稿を更新しました。私の投稿の投票を今変更できますか? – Sampath

+0

あなたの投票の '編集'と '変更'ありがとう:) @CodeCaster +1 – Sampath

関連する問題