gpt4 book ai didi

c# - LINQ to SQL 中是否存在会导致存储过程超时的错误或限制?

转载 作者:太空狗 更新时间:2023-10-29 20:40:23 25 4
gpt4 key购买 nike

我在 Windows Server 2008 R2 上使用 .NET Framework 4.0、C# 和 SQL Server 2008 R2。我的 LINQ to SQL 数据上下文位于单独的库中,相关代码在 Windows 服务中运行。

我有一个经过良好测试的关键任务存储过程,它采用大约 19 个参数(我知道我知道),执行一些简单的“if”逻辑并构建一些变量,并将数据插入 3 个表中。它不使用游标或临时表。我已经描述了 SP 的作用,因为我无权发布 sql 代码。

我在 Internet 上看到很多关于命令超时导致的 SqlException 的帖子,而响应很少超出“增加命令超时”的范围。 Example

我遇到了上述异常,因此尝试将创建数据上下文时的命令超时增加到 10 分钟。在它坐在那里等待那 10 分钟后,我仍然得到异常(exception)。然后,我添加了一些调试日志记录以捕获 LINQ to SQL 的输出,并使用相同的参数值在 SQL Server Management Studio 中运行 SP。它在几分之一秒内成功完成。

这是 LINQ to SQL 日志输出(默认情况下超时)与其他一些日志输出混合在一起,我在这篇文章中混淆了 SP 名称:

16:01:37 15269 Irrelevant log line, deleted for StackOverflow
EXEC @RETURN_VALUE = [dbo].[NAMEHIDDENONSTACKOVERFLOW] @Eastings = @p0, @Northings = @p1, @Speed = @p2, @UpdateDate = @p3, @UserId = @p4, @Postion = @p5, @Direction = @p6, @VehicleId = @p7, @Status = @p8, @Confidence = @p9, @Latitude = @p10, @Longitude = @p11, @PosLatitude = @p12, @PosLongitude = @p13, @WatchBoxId = @p14, @LastWatchBoxId = @p15, @WatchBoxIdAlert = @p16, @ImbolizationState = @p17, @TowAwayAlertState = @p18
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [560120]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [5754714]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p3: Input DateTime (Size = -1; Prec = 0; Scale = 0) [02/08/2011 20:45:08]
-- @p4: Input Int (Size = -1; Prec = 0; Scale = 0) [11]
-- @p5: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [Swindon United Kingdom]
-- @p6: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [5]
-- @p7: Input Int (Size = -1; Prec = 0; Scale = 0) [15269]
-- @p8: Input Int (Size = -1; Prec = 0; Scale = 0) [901]
-- @p9: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p10: Input Float (Size = -1; Prec = 0; Scale = 0) [51.939899]
-- @p11: Input Float (Size = -1; Prec = 0; Scale = 0) [-2.125414]
-- @p12: Input Float (Size = -1; Prec = 0; Scale = 0) [51.9333333]
-- @p13: Input Float (Size = -1; Prec = 0; Scale = 0) [-2.1]
-- @p14: Input Int (Size = -1; Prec = 0; Scale = 0) [-1]
-- @p15: Input Int (Size = -1; Prec = 0; Scale = 0) [-1]
-- @p16: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p17: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p18: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @RETURN_VALUE: Output Int (Size = -1; Prec = 0; Scale = 0) [Null]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

16:02:23 0 Error in DoPoll 1 Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

我从 Stack Overflow 搜索中得到的唯一线索是,可能存在一个名为“参数嗅探”的问题,但我仍在继续阅读以弄清楚它是关于什么的。

这是非常关键的东西,如果它在生产中失败,我会遇到很多麻烦,所以我很想回滚 LINQ 并返回 Vanilla ADO。我的问题是:我的方法有什么问题吗(换句话说:我是个白痴吗?)或者 LINQ to SQL 中是否存在某些问题或错误可能导致此问题?我能做些什么来解决这个问题,还是恢复到 Vanilla ADO 会更好?

最佳答案

我假设您已尝试增加 Linq 数据上下文的超时时间,正如您提到的,您发现的大多数帖子都暗示了这一点。

然而...

在这种情况下,让很多人感到困惑的是 Web 服务器,特别是如果您在 IIS7 上运行它。

在过去,我曾遇到过这样的情况,我花了无数个小时来追查问题,找出超时的地方,只是通过在 IIS7 管理中更改服务器应用程序的超时值,在五秒钟内修复它面板。

我并不是说这绝对是你的问题,但如果你只将网络服务器设置为 30 秒(这是默认值),你可以整天坐下来在你的数据上下文中更改超时,并且你永远到不了任何地方。

如果您想尝试一下,请登录到运行 Web 服务器的计算机,展开左侧 Pane 中的服务器/网站,向下钻取到运行存储过程的应用程序。

在这一点上,你有几个地方要看。如果您返回到网站级别 EG:“默认网站”并单击它,然后单击最右侧的高级设置并展开连接限制,您可以在其中设置整个网站的秒数。

如果您从经典的 ASP 文件调用您的 SP,请单击您的 Web 应用程序,然后双击中央 Pane 中的 ASP 图标,展开“限制属性”并更改脚本超时值以适应。

最后,如果您使用某种 CGI 操作执行此操作,请单击您的网络应用程序,然后双击 CGI,然后更改其中的时间。

最后但并非最不重要的一点是,如果以上方法均无济于事,您可以尝试将以下 XML 片段添加到应用程序 web.config 文件中的适当位置,以控制 .NET 脚本执行超时:

    <system.web>
<httpRuntime executionTimeout="180"/>
<\system.web>

如果您没有在 IIS7 上运行,那么您需要查看您的服务器用于类似设置的控制面板。

关于c# - LINQ to SQL 中是否存在会导致存储过程超时的错误或限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com