尝试执行LINQ(-to-SQL)查询时出现超时错误
System.Data.SqlClient.SqlException:超时已过期。操作完成之前经过的超时时间或服务器没有响应。
现在,这只是而不是只是一个慢查询的情况:
最后一项让我觉得我遇到了某种类型的数据库端死锁:查询被某个地方的某个锁阻塞,超时时间过去了,终止了停滞的连接。
这个想法的问题在于我只是在DataContext中做选择导致问题。 (我确实在不同的数据库/ DataContexts中发生了插入。)我也没有显式事务。这让我有点沮丧:查询行为看起来就像死锁一样,但我从未遇到过以前由某种事务隔离问题引起的死锁 - 这看起来不像这里的情况(乍一看)。
我正在寻找有关如何调试此问题的建议。我应该考虑哪些事情来确定这个问题的原因?
可能有用的一些注意事项:
union
将多个查询的结果合并在一起我最终通过重新处理查询来修复核心问题。原来不止一次地调用几张桌子(通过不同的视图)。重新制作的版本绕过了所有这些,超时时间消失了。
答案 0 :(得分:4)
再次从应用程序运行代码,等待(2分钟?)在查询窗口中运行:
;with Blockers AS
(SELECT
r.session_id AS spid
,r.cpu_time,r.reads,r.writes,r.logical_reads
,r.blocking_session_id AS BlockingSPID
,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
,s.program_name
,s.login_name
,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE r.statement_end_offset
END - r.statement_start_offset
)/2
) + 1
) AS SQLText
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
--WHERE r.session_id > 50
)
SELECT Blockers.* FROM Blockers
它将显示运行时的所有块。
答案 1 :(得分:0)
您确定连接池没有被未收集的资源吃掉吗?
尝试将SqlDataContext包装在using块中,看看问题是否仍然存在。