代码一直超时

Posted

技术标签:

【中文标题】代码一直超时【英文标题】:Code Keeps Timing Out 【发布时间】:2010-12-27 15:35:53 【问题描述】:

所以,我们得到了这组代码,由于某种原因,它一直超时。它运行的不是存储过程,因为它运行良好。此外,如果我们从 c# 代码中删除参数,代码就会运行。参数不断中断(导致超时),我们无法弄清楚原因。

c#:

public static PTWViewList GetList(int studynumber) 
        
            PTWViewList tempList = new PTWViewList();
            using (SqlConnection myConnection = new SqlConnection(AppConfiguration.cnARDB))
            
                string spName = "ardb.PTWViewSelect";
                SqlCommand myCommand = new SqlCommand(spName, myConnection);
                myCommand.CommandType = CommandType.StoredProcedure;
                myCommand.Parameters.AddWithValue("@study", studynumber); 

                myConnection.Open();
                using (NullableDataReader myReader = new NullableDataReader(myCommand.ExecuteReader())) /*this is where the code times out*/
                
                    tempList = new PTWViewList();
                    while (myReader.Read())
                    
                        tempList.Add(FillDataRecord(myReader));
                    
                    myReader.Close();
                
            

            tempList.ListCount = tempList.Count;
            return tempList;
        

存储过程:

CREATE PROCEDURE [ardb].[PTWViewSelect] 
    @studynumber int = NULL,
    @quoteid uniqueidentifier = NULL,
    @lineitemid uniqueidentifier = NULL
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        [Study]
        ,[LineItemID]
        ,[QuoteID]
        ,[Total]
        ,[COOP]
        ,[VendorCost]
        ,[CustCost]
        ,[LineItemNumber]
        ,[StudyTypeCode]
        ,[GroupLeader]
        ,[PTWDate]
        ,[PONumber]
        ,[POStatus]
        ,[StudyDirector]
        ,[SL_DESC_L]
        ,[SL_Code]
        ,ProjectDescription
        ,CreatedBy
        ,chARProcess
        ,CODate
    FROM
        [ARDB].[dbo].[PTWView]
    WHERE
        (@studynumber is null or StudyNumber=@studynumber)
        AND (@quoteid is null or QuoteID=@quoteid)
        AND (@lineitemid is null or LineItemID = @lineitemid)
END

【问题讨论】:

如果你重新添加参数并且SQL开始超时,我会说你的数据库有问题。您是否为相关列编制了索引? 如果您在 SQL Server Management Studio 中 exec PTWViewSelect 4711 会发生什么? 每次都在同一点超时吗?即... 30秒?在超时发生之前执行的最后一行代码是什么?当您说它运行良好时,存储过程是在本地运行还是远程运行? 【参考方案1】:

你试过了吗

myCommand.Parameters.AddWithValue("@studynumber", studynumber);

代替:

myCommand.Parameters.AddWithValue("@study", studynumber); 

【讨论】:

帮助使用正确的参数名称。但它也可能是部分模拟的代码。但即使它仍然应该抛出关于错误参数的错误,并且该错误不会是超时错误。 抱歉,从错误的服务器上复制了存储过程(与开发人员交谈,他同意这不是问题)【参考方案2】:

编辑 如果传递参数是问题,那么它归结为存储过程执行所需的时间。 SQL 服务器的默认超时通常为 120 秒。您可以在数据库连接字符串中添加“连接超时”以增加超时并检查。

** 旧答案 - 忽略 ** 如果没有堆栈跟踪,并且相信存储过程很好,我猜它由于连接失败而超时。该代码无法连接到您的数据库服务器,因此超时。

【讨论】:

@Oded - 哎呀错过了这个问题 - 谢谢【参考方案3】:

设置 arithabort 使 sp 需要 45 秒,而不是 1。将其重新设置为 1。我更新了存储过程以将其设置为打开,应用程序中没有任何更改。把它改成关闭了,没有变化。然后我删除了更新,然后应用程序运行良好。

我相信发生的事情是更新存储过程导致它重新编译,从而解决了问题。不过,我对此不是 100% 确定的。

【讨论】:

I updated the stored procedure to set it on 这是一个连接设置,不是 proc 设置,您必须在来自 .NET 的连接中进行 示例...MyConnection.Execute "SET ARITHABORT ON"【参考方案4】:

一件事可能是 ARITHABORT 设置,将其设置为 ON...NET 默认为 OFF

在将 ARITHABORT 设置为 OFF 的情况下在 SSMS 中运行 proc,看看它现在是否像 .NET 一样运行得更慢

例子

MyConnection.Execute "SET ARITHABORT ON"

还有一点就是你的 WHERE 子句不是最优的,看看Do you use Column=@Param OR @Param IS NULL in your WHERE clause? Don't, it doesn't perform

使用 SSMS 中的参数时,proc 是否运行缓慢?可以展示一下执行计划吗?

【讨论】:

SET ARITHABORT ON to On 在 SQL Server 2005+ 中没有任何功能差异如果ANSI_WARNINGS 处于打开状态,那么它的行为就像它处于打开状态一样。它所做的一个区别是用作计划缓存键。因此,如果在设置为打开或关闭的执行之间观察到不同的行为,这可能是参数嗅探问题。

以上是关于代码一直超时的主要内容,如果未能解决你的问题,请参考以下文章

关于esp8266烧写固件后下载Lua代码一直超时的原因

解决 HttpWebResponse.GetResponse()一直提示超时

springcloud 请求超时,记一次bug

优雅的处理Redis访问超时

NSURLSession 上传任务超时

Silverlight WCF 超时