¿Cuál es la diferencia entre SqlCommand.CommandTimeout y SqlConnection.ConnectionTimeout?

88

¿Hay alguna diferencia entre SqlCommand.CommandTimeouty SqlConnection.ConnectionTimeouten .NET?

Dhanapal
fuente
¿Es esto específico de MS SQL Server?
ympostor

Respuestas:

127

Si. CommandTimeoutes el tiempo que puede tardar un solo comando en completarse. ConnectionTimeoutes el tiempo que puede tomar establecer una conexión con el servidor para empezar.

Por ejemplo, es posible que esté ejecutando consultas de ejecución relativamente larga; está perfectamente bien que tomen 10 minutos en completarse, pero si para empezar, tomara 10 minutos hacer la conexión, sabría que algo andaba muy mal.

Jon Skeet
fuente
5
Por el bien de la discusión, digamos que tengo un! ** & # Q @? consulta que tarda 32 segundos en ejecutarse. Si configuro SqlCommand.CommandTimeout = 40 pero dejo SqlConnection.ConnectionTimeout en su valor predeterminado (presumiblemente 30), ¿se agotará el tiempo de espera de la conexión? En otras palabras, ¿tengo que configurar ambas propiedades? Parece que está diciendo "no", pero debo haberme olvidado de la propiedad SqlConnection.ConnectionTimeout y comencé a preguntarme si la configuración de CommandTimeout hace todo lo que necesito.
flipdoubt
29
flipdoubt: CommandTimeout afectará la consulta, ConnectionTimout no. ConnectionTimout no es un tiempo de espera para que la conexión realice consultas, es solo el tiempo de espera para que la conexión se conecte a la base de datos en primer lugar.
Robin Bennett
1
@JonSkeet hacen CommandTimeout y ConnectionTimeout, ¿ambos generan la misma excepción común? ¿O diferentes excepciones?
Yasser Shaikh
1
@Yasser: No lo sé, me temo.
Jon Skeet
6
Tenga en cuenta que CommandTimeout parece aplicarse solo hasta el punto en que SQL Server devuelve la primera fila al código del cliente. Por ejemplo, si tiene una consulta que devuelve la primera fila en 30 segundos, pero el conjunto de filas completo tarda horas en volver, establecer el tiempo de espera en 30 segundos no agotará el tiempo de espera de la consulta y la consulta se ejecutará durante horas. Este es principalmente el caso si no tiene operadores de bloqueo (como una Orden por) en el LHS de su plan de ejecución. (Publicando porque pasé 2 días depurando esto y ninguna otra referencia sobre el tema)
Dave
28

SqlCommand.CommandTimeout= límite de tiempo de espera para su consulta SQL. Medios, cuánto tiempo un (por ejemplo: SELECT, UPDATE) consulta pueden tomar para su ejecución. Si excede SqlCommand.CommandTimeout, detiene la ejecución. Se producirá un error de tiempo de espera del comando.

SqlConnection.ConnectionTimeout= límite de tiempo de espera para su conexión. Significa cuánto tiempo su objeto de conexión puede intentar conectarse. Si supera el tiempo especificado, deja de conectarse. Se producirá un error de tiempo de espera de conexión.

Noveno Sentido
fuente
11

ConnectionTimeoutespecifica la duración de la espera antes de que se agote el tiempo al intentar abrir un archivoSqlConnection . Es relevante para elConnection.Open() comando.

mientras

SqlCommand.CommandTimeoutespecificó la duración que debe esperar un SqlCommand antes de que se agote el tiempo de espera. Esto sucede después de que se ha abierto una conexión y ExecuteXXXse ha llamado a uno de los métodos en el objeto Command.

Cerebrus
fuente
8

Información adicional

El valor predeterminado de CommandTimeoutes 30 segundos. Cero (0) indica que no hay límite. Puede establecer el CommandTimeoutvalor solo en Codificación.

El valor predeterminado de ConnectiontTimeoutes 15 segundos. Cero (0) también indica que no hay límite. Se obtendrá un valor menor que cero (valor menos) ArgumentException. Puede establecer el ConnectionTimeoutvalor en ambos archivos de codificación y configuración.

Htin Aung
fuente
0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms
esquivando
fuente
2
Este es un tercer tipo de tiempo de espera. Ninguno de los dos sobre los que pregunta el propietario del tema. Y no responde la pregunta. No lo dejaré, porque no sé cuál era la pregunta antes de las ediciones.
Csaba Toth
0

Nota rápida sobre CommandTimeout, ya que es una propiedad de los objetos Connection y Command ...

La configuración CommandTimeout en un objeto Connection no tiene ningún efecto sobre la configuración CommandTimeout en un objeto Command en la misma Connection; es decir, la propiedad CommandTimeout del objeto Command no hereda el valor del valor CommandTimeout del objeto Connection.

Por lo tanto, la configuración de CommandTimeout en un objeto Connection solo afecta a los comandos ejecutados bajo el objeto Connection solamente (sin usar un objeto Command).

Por ejemplo, cuando se conecta a un proceso almacenado y agrega parámetros al objeto de comando, y ejecuta el objeto de comando usando la conexión de un objeto de conexión, entonces debe establecer CommandTimeout en el objeto de comando y ConnectionTimeout en el objeto de conexión para anular ambos valores predeterminados. Establecer CommandTimeout en el objeto de conexión no anulará el tiempo de espera predeterminado para los comandos del objeto de comando.

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

Brad Skidmore
fuente