我想知道是否需要在每个存储库函数中使用using语句以确保在每批数据库调用之后关闭连接。确保在调用每个回购函数后总是关闭SQL数据库连接
例如:我想在某些存储库函数内多次调用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
随着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();
}
这正是我想弄明白的。因此,如果我没有为每个函数使用语句,BaseRepository的设置方式就是这样,连接永远不会关闭正确吗?我在想也许这不是一件坏事,如果BaseRepository总是检查一个已经存在的连接是否使用它,那么为什么不长时间保持相同的连接呢?否则打开另一个连接。 –
您无需担心经常打开和关闭连接。实际上,我们鼓励您在完成后立即关闭连接。这不会真正关闭连接。它会将它返回到连接池,并且下一次尝试打开新连接(在很短的时间内)时,实际上会从池中获得连接。 –