SQL Server 的超时设置

Posted

技术标签:

【中文标题】SQL Server 的超时设置【英文标题】:Timeout setting for SQL Server 【发布时间】:2010-11-24 03:59:50 【问题描述】:

我正在使用 VSTS 2008 + ADO.Net + C# + .Net 3.5 + SQL Server 2008。我在客户端使用 ADO.Net 连接到数据库服务器以执行存储过程,然后从存储过程返回结果.

这是我的代码。我有两个关于超时的问题,

    如果我没有明确设置任何超时相关设置,对于连接到数据库服务器,是否有任何超时设置(例如,如果在某些默认时间量内无法连接到数据库服务器,则会出现一些超时例外?)?

    如果我没有明确设置任何超时相关设置,对于存储过程的执行,是否有任何超时设置(例如,如果在某些默认时间内无法从服务器检索结果到 ADO.Net 客户端,则会有是一些超时异常吗?)?

        using (SqlConnection currentConnection = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Trusted_Connection=true;Asynchronous Processing=true"))
        
            // check current batch conut
            currentConnection.Open();
            using (SqlCommand RetrieveOrderCommand = new SqlCommand())
            
                RetrieveOrderCommand.Connection = currentConnection;
                RetrieveOrderCommand.CommandType = CommandType.StoredProcedure;
                RetrieveOrderCommand.CommandText = "prc_GetOrders";
                RetrieveBatchCountCommand.Parameters.Add("@Count", SqlDbType.Int).Direction = ParameterDirection.Output;
                RetrieveBatchCountCommand.ExecuteNonQuery();
                int rowCount = Convert.ToInt32(RetrieveOrderCommand.Parameters["@Count"].Value);
            
        
    

【问题讨论】:

【参考方案1】:

sqlconnection 类中,有一个名为ConnectionTimeout 的属性。

这不能直接用于设置所需的连接超时值,因为它是只读的,即只有“get”被实现,“set”没有在这个属性上实现。所以我们必须在连接字符串中使用关键字“Connection Timeout”本身并设置所需的值。

ex:

Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;Connection Timeout=30";(30 means 30 seconds)

30 秒是建立与服务器的连接的最长时间(如172.160.0.2 或类似ADMINISTRATOR\\SQLEXPRESS)。如果无法立即建立与服务器的连接,则最多尝试 30 秒。

如果服务器有效并且能够连接到服务器并且如果数据库名称或登录凭据无效,则此超时将不适用。它会立即抛出无效凭据或数据库异常

【讨论】:

【参考方案2】:

正如 gbn 已经提到的,有两种类型的超时:

1) 连接超时:这由您的连接字符串控制:

Data Source=.;Initial Catalog=TestDB;
   Trusted_Connection=true;Asynchronous Processing=true

如果您在此字符串中添加 Connect Timeout=120,您的连接将尝试 120 秒打开然后中止。

Data Source=.;Initial Catalog=TestDB;
   Trusted_Connection=true;Asynchronous Processing=true;
   Connect Timeout=120;

2) 命令超时:对于每个命令,您还可以指定一个超时时间 - ADO.NET 将在取消查询之前等待该时间量。您在 SqlCommand 对象上指定:

    using (SqlCommand RetrieveOrderCommand = new SqlCommand())
    
       RetrieveOrderCommand.CommandTimeout = 150;
    

【讨论】:

还值得注意的是,连接字符串上的“连接超时”参数还控制 SqlTransaction.Commit 方法的超时 谢谢 Marc,什么样的异常会被抛出,或者换句话说,我们应该在我们的代码中捕获什么样的异常来处理超时问题? 谢谢菲利普,你的意思是除了连接超时和命令超时,还有第三种超时,称为事务超时? @George2,是的,这是正确的。它是一个晦涩难懂的东西,让我们陷入了生产。这是有关它的一些信息。 social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/… 对于连接,如果连接字符串无效,您通常会看到 SqlException(如果通常出现错误)、SecurityException(如果在部分信任环境中缺少权限)或 ArgumentException。 SqlCommand 将 SqlException 作为一般异常,加上 InvalidArgument 或 SecurityEXceptions,具体取决于您调用的方法 - 有关详细信息,请参阅 MSDN 文档以了解哪些方法引发了哪些异常(此处无法列出)【参考方案3】:

是的,有2种超时时间可以设置

    Connection timeout Command timeout

在 VBA、.net 等中都默认为 30 秒

【讨论】:

感谢 gbn!会抛出什么样的异常,或者换句话说,我们应该在代码中捕获什么样的异常来处理超时问题? 在 SSMS 中,我收到“超时已过期。在操作完成之前超时时间已过或服务器没有响应。”您可以使用 WAITFOR DELAY '00:00:40' 进行测试,以强制等待 40 秒,并且命令超时异常。连接超时,可以自己编一个服务器名,尝试连接。 谢谢,命令超时,应该捕获什么样的异常?

以上是关于SQL Server 的超时设置的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在Microsoft SQL Server上为SQL查询设置超时?

SQL Server 代理作业超时

在 SQL Server 中设置最大连接超时的最佳方法

SQL Server 简单插入语句超时

为啥我的SQL SERVER2005在连接ODBC时会出现连接超时过期呢

[Microsoft][ODBC SQL Server Driver]超时已过期