我使用实体框架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.InternalDispatcher1.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"}
任何想法为什么我在生产机器上得到上述错误,而它在开发时工作正常?
答案 0 :(得分:3)
一个看似手指骨折的男子走进医生的办公室。 "医生" ,他说,"当我按这里时,它会受伤#34; 。医生看起来并且去了"嗯,如果你按下的话不那么努力,那就少了,对吗?" 然后把男人带回家。
当遇到数据库超时时,解决方案是 NOT ,并且只是增加了超时,这是你来到这里的可怕建议。
分析并分析您的查询,并根据该分析的结果优化您的数据库和查询。
答案 1 :(得分:1)
您可以增加超时时间,如下所示。试试并告诉我们。
重要提示:这只是一个临时解决方案。您必须分析您的EF查询,并且必须提高它的性能。换句话说,您需要优化该查询。因此,您的开发数据库拥有的数据较少,您没有遇到这种情况。但是由于数据负载过重(如生产),您遇到了超时问题。 最佳解决方案是优化您的EF查询 。
注意:此处时间为秒
public DbContext() : base("Default")
{
this.Database.CommandTimeout = 60;
}
答案 2 :(得分:0)
最好设置超时= 0 ,0将定义为无限制。
this.Database.CommandTimeout = 0;