Asegurarse de que una conexión SQL db esté siempre cerrada después de llamar a cada función repo

c# dapper idisposable repository sql-server

Pregunta

Estoy tratando de averiguar si necesito una instrucción de uso en cada una de las funciones de mi repositorio para asegurarme de que la conexión se cierre después de cada lote de llamadas a la base de datos.

Por ejemplo: deseo llamar a connection.query o connection.execute varias veces dentro de ciertas funciones del repositorio. Si no uso una declaración de uso, ¿cuándo se cerrará mi conexión? El objetivo es hacer que sea lo más eficiente posible para el desarrollo web.

BaseRepository

public static string ConnectionString => @"Server=.;Database=applicationDb;User ID=sa;Password=Password12!";
protected SqlConnection _connection;
protected SqlConnection connection => _connection ?? (_connection = GetOpenConnection());

public static SqlConnection GetOpenConnection(bool mars = false)
{
    var cs = ConnectionString;
    if (mars)
    {
        var scsb = new SqlConnectionStringBuilder(cs)
        {
            MultipleActiveResultSets = true
        };
        cs = scsb.ConnectionString;
    }
    var connection = new SqlConnection(cs);
    connection.Open();
    return connection;
}

public SqlConnection GetClosedConnection()
{
    var conn = new SqlConnection(ConnectionString);
    if (conn.State != ConnectionState.Closed) throw new InvalidOperationException("should be closed!");
    return conn;
}

public void Dispose()
{
    _connection?.Dispose();
}

CustomerRepository: BaseRepository

Con la configuración del BaseRepository tal como está. ¿Hay alguna diferencia entre lo siguiente?

public IEnumerable<Customer> GetCustomers()
{
    using (connection)
    {
        StringBuilder sql = new StringBuilder();
        sql.AppendLine("SELECT Id, Name, Email ");
        sql.AppendLine("FROM Customer;");

        StringBuilder deleteSql = new StringBuilder();
        deleteSql = new StringBuilder();
        deleteSql.AppendLine("DELETE FROM Xyz ");
        deleteSql.AppendLine("FROM CustomerId = @CustomerId;");
        connection.Execute(deleteSql.ToString(), new { CustomerId = 5 });

        return connection.Query<Customer>(sql.ToString()).ToList();
    }
}

O sin el uso:

public IEnumerable<Customer> GetCustomers()
{
        StringBuilder sql = new StringBuilder();
        sql.AppendLine("SELECT Id, Name, Email ");
        sql.AppendLine("FROM Customer;");

        StringBuilder deleteSql = new StringBuilder();
        deleteSql = new StringBuilder();
        deleteSql.AppendLine("DELETE FROM Xyz ");
        deleteSql.AppendLine("FROM CustomerId = @CustomerId;");
        connection.Execute(deleteSql.ToString(), new { CustomerId = 5 });

        return connection.Query<Customer>(sql.ToString()).ToList();
}

Respuesta aceptada

Debe ajustar sus llamadas en la declaración de using (o try...catch si desea manejar las excepciones), y la cerrará y eliminará automáticamente.


Respuesta popular

Mi sugerencia aquí es usar el enunciado using , porque el propósito de using enunciado es que cuando el control llegue al final del uso, eliminará ese objeto de usar bloque y liberar memoria. su propósito no es solo cerrar la conexión automática, básicamente eliminará el objeto de conexión y obviamente la conexión también se cerrará debido a ello.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué