为什么我访问数据库时出现Timeout过期错误?

时间:2016-09-06 09:32:00

标签: .net sql-server entity-framework

我使用实体框架6来访问数据库。 在开发机器上我有SQL SERVER 2014 Express版。 当我使用EF6进行一些复杂的查询时,它可以正常工作,我得到了理想的结果。

在生产机器上,当我将SQL Server 2012从开发机器移动到生产并且查询被触发时,我得到了这个错误:

  

{"消息":" System.Data.SqlClient.SqlException   (0x80131904):超时已过期。超时时间过去之前   完成操作或服务器没有响应。 --->   System.ComponentModel.Win32Exception(0x80004005):等待操作   超时\ r \ n at   System.Data.SqlClient.SqlConnection.OnError(SqlException异常,   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完成,Int32超时,Task&   task,Boolean asyncWrite)\ r \ n at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String   方法)\ r \ n at   System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior   行为,字符串方法)\ r \ n at   System.Data.Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func 3操作,TInterceptionContext interceptionContext,   行动3 executing, Action 3已执行)\ 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   行为)\ r \ nClientConnectionId:4a0350b7-e91e-42a4-ae04-ae94e294c26a \ r \ n错误   号:-2,状态:0,类别:11"}

任何想法为什么我在生产机器上得到上述错误,而它在开发时工作正常?

3 个答案:

答案 0 :(得分:3)

一个看似手指骨折的男子走进医生的办公室。 "医生" ,他说,"当我按这里时,它会受伤#34; 。医生看起来并且去了"嗯,如果你按下的话不那么努力,那就少了,对吗?" 然后把男人带回家。

当遇到数据库超时时,解决方案是 NOT ,并且只是增加了超时,这是你来到这里的可怕建议。

分析并分析您的查询,并根据该分析的结果优化您的数据库和查询。

答案 1 :(得分:1)

您可以增加超时时间,如下所示。试试并告诉我们。

重要提示:这只是一个临时解决方案。您必须分析您的EF查询,并且必须提高它的性能。换句话说,您需要优化该查询。因此,您的开发数据库拥有的数据较少,您没有遇到这种情况。但是由于数据负载过重(如生产),您遇到了超时问题。 最佳解决方案是优化您的EF查询

注意:此处时间为秒

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

参考:MSDN: Database.CommandTimeout Property

答案 2 :(得分:0)

最好设置超时= 0 ,0将定义为无限制。

this.Database.CommandTimeout = 0;