C# 确保在调用每个repo函数后始终关闭SQL db连接

C# 确保在调用每个repo函数后始终关闭SQL db连接,c#,sql-server,repository,dapper,idisposable,C#,Sql Server,Repository,Dapper,Idisposable,我试图弄清楚我是否需要在我的每个存储库函数中使用语句,以确保在每批数据库调用之后连接关闭 例如:我想在某些存储库函数中多次调用connection.query或connection.execute。如果我不使用using语句,我的连接何时会关闭?目标是使其在web开发中尽可能高效 BaseRepository public static string ConnectionString => @"Server=.;Database=applicationDb;User ID=sa;Passw

我试图弄清楚我是否需要在我的每个存储库函数中使用语句,以确保在每批数据库调用之后连接关闭

例如:我想在某些存储库函数中多次调用connection.query或connection.execute。如果我不使用using语句,我的连接何时会关闭?目标是使其在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

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();
}
使用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 GetCustomers()
{
使用(连接)
{
StringBuilder sql=新的StringBuilder();
AppendLine(“选择Id、名称、电子邮件”);
sql.AppendLine(“来自客户;”);
StringBuilder deleteSql=新建StringBuilder();
deleteSql=新的StringBuilder();
deleteSql.AppendLine(“从Xyz中删除”);
deleteSql.AppendLine(“FROM CustomerId=@CustomerId;”);
Execute(deleteSql.ToString(),new{CustomerId=5});
返回connection.Query(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();
}
public IEnumerable GetCustomers()
{
StringBuilder sql=新的StringBuilder();
AppendLine(“选择Id、名称、电子邮件”);
sql.AppendLine(“来自客户;”);
StringBuilder deleteSql=新建StringBuilder();
deleteSql=新的StringBuilder();
deleteSql.AppendLine(“从Xyz中删除”);
deleteSql.AppendLine(“FROM CustomerId=@CustomerId;”);
Execute(deleteSql.ToString(),new{CustomerId=5});
返回connection.Query(sql.ToString()).ToList();
}

您需要使用
语句(或者
如果您希望处理异常,请尝试…catch
)将调用包装在
中,它将自动关闭并处理它。

我的建议是使用
使用
语句,因为
使用
语句的目的是,当控件达到使用结束时,它将处理使用块的对象并释放内存。它的用途不仅仅是自动关闭连接,基本上它将处理连接对象,显然连接也因此关闭。

这正是我想弄明白的。因此,使用BaseRepository的设置方式,如果我没有每个函数的using语句,连接将永远不会关闭,正确吗?我在想也许这不是一件坏事,如果BaseRepository总是检查一个连接是否已经存在,为什么不保持同一个连接很长时间呢?使用它,否则就打开另一个连接。你不必担心频繁地打开和关闭连接。实际上,我们鼓励您在完成连接后立即关闭连接。这不会真正关闭连接。它只会将其返回到连接池,下次您尝试打开新连接时(在短时间内),实际上会从连接池中获得一个连接。