实体框架 4 存储过程调用超时

2024-03-19

我有一个导入到 EF4 中的存储过程,当我在 30 秒后使用某些参数调用它时,它会抛出超时错误。在 SQL Server Profiler 中,我可以看到使用正确参数的存储过程调用仅花费了 30 秒多一点,这是我的应用程序的超时时间。

然而,当我执行发送到查询分析器中的探查器的相同 SQL 时,它会执行亚秒。什么可能导致从 EF 调用和从 SQL Server Management Studio 调用之间存在这种差异?

.NET 错误的完整堆栈跟踪如下。

[SqlException (0x80131904):超时已过期。超时时间 操作完成之前已过去或服务器未完成 回应。]
System.Data.SqlClient.SqlConnection.OnError(SqlException异常, 布尔中断连接)+2073486
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔中断连接)+5064444
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet BulkCopyHandler、TdsParserStateObject 状态对象)+2275
System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
System.Data.SqlClient.SqlDataReader.get_MetaData() +86
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,字符串resetOptionsString)+311
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔值 returnStream、布尔值 异步)+987
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔值 returnStream、字符串 方法,DbAsyncResult 结果)+162
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔值 returnStream、字符串 方法)+32
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)+141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)+12
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior行为) +10 System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand 实体命令、CommandBehavior 行为)+443

[EntityCommandExecutionException:执行时发生错误 命令定义。有关详细信息,请参阅内部异常。]
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand 实体命令、CommandBehavior 行为)+479
System.Data.Objects.ObjectContext.CreateFunctionObjectResult(EntityCommand 实体命令、实体集实体集、EdmType edmType、MergeOption 合并选项)+182
System.Data.Objects.ObjectContext.ExecuteFunction(字符串函数名, MergeOption mergeOption、ObjectParameter[] 参数)+218
System.Data.Objects.ObjectContext.ExecuteFunction(字符串函数名, ObjectParameter[] 参数)+53
MetaView.DAL.MFCMData.MFCMDATAEntities.GetTradingOpenPositionCounterParty(可为空1 positionDT, Nullable1个交易账户ID)中 C:\Projects\CASH\web\MetaView\MetaView.DAL.MFCMData\MFCMData.Designer.cs:7064 MetaView.BusinessLayer.Shared.Accounts.CounterParties.GetCounterParties(Int32 交易账户ID)中 C:\Projects\CASH\web\MetaView\MetaView.BusinessLayer\Shared\Accounts\CounterParties.cs:161


几周前我遇到了一个类似的问题,我们的一位 DBA 向我解释了这个问题(当然根据我的水平进行了解释和简化):

当调用 SQL Server 存储过程时,服务器会为每个存储过程创建并缓存一个执行计划per object_id。有时,SQL Server 可能会根据传入的参数值创建错误的执行计划(在我们的示例中,对于可为空的参数,它为 null)。发生这种情况时,快速修复方法是运行sp_recompile 'Schema.Procedure'在 SQL Server Management Studio(或您可能使用的任何数据库管理工具)中。这一切所做的就是清除该存储过程的计划缓存。如果过程的下一个被调用者再次传入“坏”参数值,您将陷入相同的情况所以真正的解决方法是使用以下命令给查询一个提示OPTIMIZE FOR语法(参见http://msdn.microsoft.com/en-gb/library/ms181714.aspx http://msdn.microsoft.com/en-gb/library/ms181714.aspx).

简而言之,如果您添加OPTION (OPTIMIZE FOR (@myParameter = 'Some value that gives you a GOOD execution plan'))在你之后WHERE and/or ORDER BY条款应该解决这个问题。

另外,如果您想知道为什么执行时sameSSMS 中的 SQL 总是能快速获得结果,这是因为 SSMS 的 ARITHABORT 选项的默认设置为 ON(SET ARITHABORT ON),所有其他应用程序默认设置为关闭,但它的工作原理及其影响超出了我的经验,我没有费心去阅读它。我被告知我不应该使用它。我确信真正的 DBA 可以更好地解释原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 4 存储过程调用超时 的相关文章

随机推荐

  • 如何根据定时器改变div的内容

    jquery 有没有办法根据计时器更改 div 的内容 假设我有提供 提示 的模块 提示内容应每 5 秒更改一次 Thanks 制定一系列提示 然后做一个interval5秒改变div的内容 我假设您想要随机提示 请参阅 jsFiddle
  • SVG 内的链接图像

    想象一下以下 SVG
  • Android NDK - NativeActivity 与 JNI 库

    两年前 我开发了一个增强现实框架android 7 闪电泡芙 http developer android com about versions android 2 1 html 由于 AR 应用程序是计算密集型任务 因此我开发了一个 JN
  • 我应该使用类还是字典?

    我有一个只包含字段而不包含方法的类 如下所示 class Request object def init self environ self environ environ self request method environ get R
  • 如何创建通用存储库?

    我想知道是否有人有关于制作通用存储库的任何好的教程 或者甚至可能是已经制作好的并且有详细记录的库 我当前正在使用 linq to sql 但它可能会发生变化 所以我不知道您是否可以创建一个通用存储库 如果我说切换到实体框架 则几乎不需要任何
  • 以编程方式展开/折叠 CoordinatorLayout 中的底部导航视图

    我有一个CoordinatorLayout其中包含一个BottomNavigationView and an AppBarLayout with a ToolBar在它里面 这BottomNavigationView不在里面AppBarLa
  • 部署不渲染 Kendo UI

    VS2012 asp net MVC4 c 带有 KendoUI 实现的互联网应用程序 最简单的说法是我的网站看起来像这样 开发机器上的本地 像这样部署 我检查了服务器 Kendo UI 论坛 所有论坛都指向图像丢失 我检查了甚至复制了我的
  • 授予 EC2 实例对 S3 存储桶的访问权限

    我想授予我的 ec2 实例对 s3 存储桶的访问权限 在此 ec2 实例上 启动了一个包含我的应用程序的容器 现在我没有获得 s3 存储桶的许可 这是我的存储桶政策 Version 2012 10 17 Id Policy146280822
  • 如何使用iPhone SDK下载文本文件?

    我是开发基于视图的 iPhone 应用程序的新手 我需要下载 这个 txt 文件来自互联网 并将其保存到应用程序的文档文件夹中 谁能简单地告诉我如何做到这一点 txt 文件很小 所以我不会 需要任何用户界面对象 Thanks Kevin N
  • 如何使用CSS仅在移动设备上显示文本?

    我有一个文本 在 div 中 显示在桌面和移动屏幕上 Expected 我希望文本仅显示在 media only screen and max width 768px How to 隐藏 div 与display none or 还有其他解
  • Django-rest-framework 多个 url 参数

    如何将 示例对象 映射到 url website com api
  • 编辑 PrimeNG 组件的 CSS

    我目前正在使用 Angular 4 Angular Materials 和 PrimeNG 组件开发用户界面 我正在处理的最新组件是来自 PrimeNG 的 MultiSelect 组件 https www primefaces org p
  • iOS 禁用横向 LaunchScreen.storyboard

    我有一个LaunchScreen storybaord显示徽标 文本 因此与方向无关 该应用程序始终以纵向启动 但它有某些允许横向模式的视图控制器 因此不能选择仅使应用程序纵向 我想要的是启动屏幕始终以纵向显示 因此 在应用程序启动期间将手
  • 通过模拟器发送电话号码

    我正在制作一个应用程序 我想检索设备电话号码并将其发送到服务器上 但我正在 Android 模拟器上测试这个应用程序 谁能告诉我如何在模拟器和实际设备中设置或获取电话号码 Thanks 如果我们使用电话管理器 我们可以在模拟器中获取电话号码
  • 如何在 Entity Framework Core 中删除多行? [复制]

    这个问题在这里已经有答案了 我需要使用 Entity Framework Core 从数据库中删除多行 此代码不起作用 foreach var item in items myCollection Remove item 因为我在第一个对象
  • 如何测试 Ruby on Rails 功能测试的 JSON 结果?

    我该如何维护我的Ajax http en wikipedia org wiki Ajax 28programming 29请求并测试 Ruby on Rails 功能测试的 JSON 输出 在 Rails gt 5 中 Use Action
  • Jena PrefixMapping:当模型是从数据集中获取的命名模型时,基本命名空间缺失

    这是我用来加载的代码OntModel to a Dataset作为命名模型 然后我尝试检索PrefixMapping以两种不同的方式实现相同的目的 public static void loadDatasetwithNamedModels
  • 获取“exec”调用中最后一个表达式的值

    假设我在字符串中有一些 python 代码 code a 42 a and I exec那串代码 result exec code Then result一直会None 有没有办法获得最后一个表达式的值 在这种情况下 那就是5 since
  • VueJS 读取 Dom 属性

    我想获取按钮单击事件的 href 属性 a href user all 2 i class fa fa edit i span Get Data span a 主要 JS 文件 new Vue el body methods func fu
  • 实体框架 4 存储过程调用超时

    我有一个导入到 EF4 中的存储过程 当我在 30 秒后使用某些参数调用它时 它会抛出超时错误 在 SQL Server Profiler 中 我可以看到使用正确参数的存储过程调用仅花费了 30 秒多一点 这是我的应用程序的超时时间 然而