SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有什么区别?

99

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


这个特定的问题只适用于 MS SQL Server 吗? - ympostor
6个回答

147

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

例如,您可能正在执行相对运行时间较长的查询 - 他们花费10分钟来完成是完全可以接受的,但如果刚开始建立连接就需要10分钟,那么您会知道出了严重问题。


6
为了举例说明,假设我有一个查询需要运行32秒。如果我将SqlCommand.CommandTimeout设置为40而将SqlConnection.ConnectionTimeout保留为其默认值(可能是30),连接会超时吗?换句话说,我是否必须同时设置这两个属性?听起来你的意思是“不需要”,但我可能忘记了SqlConnection.ConnectionTimeout属性,开始质疑设置CommandTimeout是否能够满足我所有的需求。 - flipdoubt
34
flipdoubt - CommandTimeout会影响查询,而ConnectionTimeout则不会。 ConnectionTimeout不是连接执行查询的超时时间 - 它只是连接首次连接到数据库的超时时间。 - Robin Bennett
1
@JonSkeet,CommandTimeout和ConnectionTimeout两者是否会生成相同的常见异常?还是不同的异常? - Yasser Shaikh
1
@Yasser:我不知道,很抱歉。 - Jon Skeet
8
请记住,CommandTimeout 看起来只适用于从 SQL Server 返回第一行到客户端代码的时间。比如,如果查询在30秒内返回第一行,但完成整个行集需要几个小时,将超时设置为30秒将无法超时查询,并且查询将运行数小时。这主要是因为您在执行计划的左侧没有阻止运算符(例如 Order by)的情况下发生。(发布此内容是因为我花了2天时间调试此问题,并没有其他相关参考资料可供使用) - Dave
显示剩余2条评论

33

SqlCommand.CommandTimeout 是你的 SQL 查询的超时限制。意味着一个 (例如:SELECT, UPDATE) 查询可以花多少时间来执行。如果它超过了 SqlCommand.CommandTimeout,那么它就会停止执行。这将导致一个命令超时错误。

SqlConnection.ConnectionTimeout 是你的连接的超时限制。意味着连接对象尝试连接可以花费多长时间。如果它超过指定的时间,它就会停止连接。这将导致一个连接超时错误。


11

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

SqlCommand.CommandTimeout指定了一个SqlCommand在调用Command对象的ExecuteXXX方法后,在连接已经打开的情况下等待超时的持续时间。


8

附加信息

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

ConnectionTimeout的默认值为15秒。零(0)同样表示没有限制。小于零的值(负值)将导致ArgumentException。您可以在编码和配置文件中都设置ConnectionTimeout的值。


0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms

2
这是第三种类型的超时。不是主题所有者问的两种之一。并且没有回答问题。我不会打-1,因为我不知道编辑前的问题是什么。 - Csaba Toth

0

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

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

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

例如:当您连接到存储过程并向命令对象添加参数,并使用 Connection 对象的连接执行 Command 对象时,您需要在 Command 对象上设置 CommandTimeout 和 Connection 对象上的 ConnectionTimeout 来覆盖两个默认值。在 Connection 对象上设置 CommandTimeout 将无法覆盖 Command 对象命令的默认超时时间。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接