确保在调用每个 repo 函数后始终关闭 SQL 数据库连接
Making sure a SQL db connection is always closed after each repo function is called
我想弄清楚是否需要在我的每个存储库函数中使用 using 语句,以确保连接在每批数据库调用后关闭。
例如:我想在某些存储库函数中多次调用 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();
}
客户资料库:基础资料库
按照原样设置 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
语句的目的是当控制到达使用结束时它会处理那个正在使用块的对象并释放内存。它的目的不仅是为了自动关闭连接,基本上它会处理连接对象,显然连接也会因此而关闭。
我想弄清楚是否需要在我的每个存储库函数中使用 using 语句,以确保连接在每批数据库调用后关闭。
例如:我想在某些存储库函数中多次调用 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();
}
客户资料库:基础资料库
按照原样设置 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
语句的目的是当控制到达使用结束时它会处理那个正在使用块的对象并释放内存。它的目的不仅是为了自动关闭连接,基本上它会处理连接对象,显然连接也会因此而关闭。