2017-07-02 30 views
0

我想知道是否需要在每个存储库函数中使用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(); 
} 

回答

1

你需要(如果你想处理异常或try...catch)包裹在using声明您的来电,并将关闭它并自动处理它。

+0

这正是我想弄明白的。因此,如果我没有为每个函数使用语句,BaseRepository的设置方式就是这样,连接永远不会关闭正确吗?我在想也许这不是一件坏事,如果BaseRepository总是检查一个已经存在的连接是否使用它,那么为什么不长时间保持相同的连接呢?否则打开另一个连接。 –

+1

您无需担心经常打开和关闭连接。实际上,我们鼓励您在完成后立即关闭连接。这不会真正关闭连接。它会将它返回到连接池,并且下一次尝试打开新连接(在很短的时间内)时,实际上会从池中获得连接。 –

2

我这里的建议是使用using声明,因为using声明的目的是当控件将达到使用结束时它将配置该使用块的对象并释放内存。它的目的不仅在于自动连接关闭,基本上它会配置连接对象,明显连接也因此关闭。