각 repo 함수가 호출 된 후 항상 SQL db 연결이 닫혀 있는지 확인

c# dapper idisposable repository sql-server

문제

데이터베이스 호출의 각 배치 후에 연결이 닫히는 지 확인하기 위해 각 저장소 함수에서 using 문이 필요한지 알아 내려고합니다.

예를 들면 : 특정 저장소 함수 내에서 connection.query 또는 connection.execute를 여러 번 호출하려고합니다. 내 연결이 언제 닫힙니다 사용 문을 사용하지 않으면? 목표는 웹 개발에 최대한 효율적으로 적용하는 것입니다.

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

BaseRepository 설정을 그대로 사용하십시오. 다음과 같은 점이 다릅니다 :

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();
    }
}

또는 사용하지 않고 :

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();
}

수락 된 답변

당신은 문장을 using 당신의 전화를 포장해야합니다 (또는 예외를 처리하고자하는 경우 try...catch ), 그리고 그것을 닫고 자동으로 처분합니다.


인기 답변

여기에 제안 내 것은 사용하는 것입니다 using 의 목적으로하기 때문에, 문을 using 문을 제어 사용의 끝에 도달 할 때 블록 및 최대 사용 가능한 메모리를 사용하여 객체를 처리하는 것입니다. 그것의 목적은 자동 연결 닫기에 대한 것뿐만 아니라, 기본적으로 연결 개체를 처리 할 것이고 분명히 그것 때문에 연결도 닫힐 것입니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.