【发布时间】:2011-09-05 15:50:21
【问题描述】:
我在 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 分钟后,我仍然得到异常。然后,我添加了一些调试日志记录以捕获 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 并返回原版 ADO。我的问题是:我的方法有什么问题吗(换句话说:我是个白痴吗?)或者 LINQ to SQL 中是否存在可能导致此问题的问题或错误?我可以做些什么来解决这个问题,还是恢复到香草 ADO 会更好?
【问题讨论】:
-
如果是参数嗅探,可以尝试几件事:elegantcode.com/2008/05/17/… 和 stackoverflow.com/questions/6986607/…
-
解决方案:重启! - 这个也让我发疯(小 SP,LINQ 超时,SSMS 即时,即使来自分析器的 SQL 调试打印调用失败)。我重新启动了我的 VirtualBox 瞧。该死的!我永远学不会。总是一样。很难将重新启动视为来自 linux 的解决方案......
标签: c# linq-to-sql stored-procedures