SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有啥区别?

Posted

技术标签:

【中文标题】SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有啥区别?【英文标题】:What is the difference between SqlCommand.CommandTimeout and SqlConnection.ConnectionTimeout?SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有什么区别? 【发布时间】:2010-10-25 05:44:14 【问题描述】:

.NET 中SqlCommand.CommandTimeoutSqlConnection.ConnectionTimeout 有什么区别吗?

【问题讨论】:

这是特定于 MS SQL Server 的吗? 【参考方案1】:

是的。 CommandTimeout 是完成单个命令所需的时间。 ConnectionTimeout 是建立与服务器的连接开始所需的时间。

例如,您可能正在执行运行时间相对较长的查询 - 它们需要 10 分钟才能完成完全可以,但如果需要 10 分钟才能开始连接,您就会知道有些事情很糟糕错了。

【讨论】:

为了争论,假设我有一个 !**Q@?运行需要 32 秒的查询。如果我设置 SqlCommand.CommandTimeout = 40 但将 SqlConnection.ConnectionTimeout 保留为默认值(大概是 30),连接会超时吗?换句话说,我必须设置这两个属性吗?听起来你在说“不”,但我一定忘记了 SqlConnection.ConnectionTimeout 属性,并开始质疑设置 CommandTimeout 是否能满足我的所有需求。 flipdoubt - CommandTimeout 会影响查询,ConnectionTimout 不会。 ConnectionTimout 不是连接执行查询的超时 - 它只是连接首先连接到数据库的超时。 @JonSkeet 执行 CommandTimeout 和 ConnectionTimeout,都生成相同的常见异常?还是不同的例外? @Yasser:我不知道,恐怕。 请记住,CommandTimeout 似乎只适用于直到第一行从 SQL Server 返回到客户端代码的点为止。例如,如果您有一个在 30 秒内返回第一行的查询,但完整的行集需要几个小时才能返回,则将超时设置为 30 秒不会使查询超时并且查询将运行几个小时。如果您的执行计划的 LHS 上没有阻塞运算符(例如 Order by),这主要是这种情况。 (发帖是因为我花了 2 天时间调试这个并且没有关于这个主题的其他参考)【参考方案2】:

SqlCommand.CommandTimeout = SQL 查询的超时限制。意味着,一个(例如:SELECTUPDATE)查询可以花费多少时间来执行。如果超过SqlCommand.CommandTimeout,则停止执行。将发生命令超时错误。

SqlConnection.ConnectionTimeout = 连接超时限制。意味着,您的连接对象可以尝试连接多长时间。如果超过指定时间,则停止连接。会出现连接超时错误。

【讨论】:

【参考方案3】:

ConnectionTimeout 指定尝试打开 SqlConnection 时超时前等待的持续时间。与Connection.Open() 命令相关。

同时

SqlCommand.CommandTimeout 指定了 SqlCommand 在超时前等待的持续时间。这发生在打开连接并且在 Command 对象上调用了 ExecuteXXX 方法之一之后。

【讨论】:

【参考方案4】:

附加信息

CommandTimeout 的默认值为 30 秒。零 (0) 表示没有限制。您只能在编码中设置CommandTimeout 值。

ConnectiontTimeout 的默认值为 15 秒。零(0)也表示没有限制。小于零值(负值)将获得ArgumentException。您可以在 Coding 和 Config 文件中设置 ConnectionTimeout 值。

【讨论】:

【参考方案5】:
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms

【讨论】:

这是第三种超时类型。不是主题所有者询问的两个之一。并且不回答问题。我不会 -1 它,因为我不知道编辑前的问题是什么。【参考方案6】:

关于 CommandTimeout 的快速说明,因为它是 Connection 和 Command 对象的属性...

Connection 对象上的 CommandTimeout 设置对同一 Connection 上的 Command 对象上的 CommandTimeout 设置没有影响;也就是说,Command 对象的 CommandTimeout 属性不继承 Connection 对象的 CommandTimeout 值。

因此,Connection 对象上的 CommandTimeout 设置仅影响在 Connection 对象下执行的命令(不使用 Command 对象)。

例如当您连接到存储过程并向命令对象添加参数并使用连接对象的连接执行命令对象时,您需要在命令对象上设置 CommandTimeout 并在 Connection 对象上设置 ConnectionTimeout 以覆盖这两个默认值.在连接对象上设置 CommandTimeout 不会覆盖命令对象命令的默认超时。

https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15 https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/connectiontimeout-property-ado?view=sql-server-ver15

【讨论】:

以上是关于SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章