Abortar conexión SQL SERVER desde .NET
En ocasiones, las consultas a
base de datos quedan en ejecución o en espera ocupando recursos de los
servidores SQL e incluso bloqueando la base de datos, por ello, es recomendable
configurar el timeout para cada consulta según su tiempo de ejecución.
En el siguiente ejemplo se
muestra como configurar el timeout a través de SqlCommand:
Try
{
//Consulta
SQL
var sql = "SELECT
* FROM USUARIO";
//Conexión
SQL
using
(SqlConnection connection = new SqlConnection(connString))
{
//Comando para ejecutar la consulta
using
(SqlCommand command = new SqlCommand(sql,
connection))
{
//Configuración del Timeout
command.CommandTimeout = 1; // En segundos
//Ejecución del comando
SqlDataReader dataReader = command.ExecuteReader();
}
}
}
catch (Exception ex)
{
//Al
generarse una excepción por exceder el timeout, automáticamente se cancela la consulta a base de datos
}
En el ejemplo anterior, se ha configurado el “CommandTimeout”
en 1 segundo, si la consulta tarda más tiempo se generará una excepción y
automáticamente se cancelará la consulta a nivel de aplicación y de base de
datos.
Para no dejar conexiones o consultas abiertas, es
recomendable usar “using” que automáticamente, ejecuta las sentencias close y
dispose.
Consideraciones:
·
Si se configura el CommandTimeout a 0, el
timeout será infinito. El tiempo de
espera será el configurado en la base de datos (Generalmente 10 minutos).
·
En caso de no configurar el timeout, el valor
por defecto es de 30 segundos.
Para cerrar físicamente la conexión a base de datos,
se podría utilizar “ClearPool”, en el siguiente ejemplo se usa el comando
dentro del catch para que cierre la conexión si se produce algún error en la
aplicación.
catch
(Exception ex)
{
SqlConnection.ClearPool(connection);
}