Ste*_*edy 7 c# stored-procedures linq-to-sql
我在Windows Server 2008 R2上使用.NET Framework 4.0,C#和SQL Server 2008 R2.我的LINQ to SQL数据上下文位于一个单独的库中,并且有问题的代码在Windows服务中运行.
我有一个经过良好测试,任务关键型存储过程,它需要大约19个参数(我知道我知道),执行一些简单的"if"逻辑并构建一些变量,并将数据插入到3个表中.它不使用游标或临时表.我已经描述了SP的作用,因为我无权发布sql代码.
由于命令超时,我在互联网上看到很多关于SqlException的帖子,而且响应很少超出"增加命令超时".例
我得到了上述异常,因此在创建数据上下文到10分钟时尝试增加命令超时.在它坐在那里等待那10分钟后我仍然得到例外.然后我添加了一些调试日志记录来捕获LINQ to SQL的输出,并使用相同的参数值在SQL Server Management studio中运行SP.它在几分之一秒内成功完成.
这是LINQ to SQL Log输出(默认情况下超时)与其他一些日志输出混合在一起,我在这篇文章中对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.
Run Code Online (Sandbox Code Playgroud)
我从搜索Stack Overflow中获得的唯一线索是,可能存在一个称为"参数嗅探"的问题,但我仍然在阅读它以解决它的问题.
这是非常关键的东西,如果它在生产中失败我会遇到很多麻烦,所以我很想回滚LINQ并返回到香草ADO.我的问题是:我的方法有什么问题(换句话说:我是白痴吗?)或LINQ to SQL中是否存在一些可能导致此问题的问题或错误?有什么我可以做的来解决这个问题,还是更好地恢复到香草ADO?
我恢复到 vanila ADO 并得到了相同的异常,因此答案必须是“不,这不是 LINQ to SQL bug”。我还根据参数嗅探文章重构了 SP,但没有帮助。由于代码再次开始工作,我只能想象这是一个临时系统问题或数据库故障。为了其他有类似问题并稍后通过搜索找到此问题的人的利益,如果我发现更多内容,我将进一步更新,因为同事很快将在另一个系统上测试代码。
编辑:这是一个系统问题;具体来说,我的 VMWare 磁盘需要进行碎片整理。
(根据元建议,我应该发布自己的答案而不是更新问题)。