3

我有一个视图,需要从我系统中的多个存储库中填充信息。

var employee = employeeRepository.GetEmployeeById(20);
var notes = notesRepository.GetNotes();

我正在使用 ADO.NET 进行数据访问。每个存储库都应该将连接作为参数吗?

using(var connection = dbFactory.GetConnection())
{    
    var employeeRepository = new EmployeeRepository(connection);
    var notesRepository = new NotesRepository(connection);
}

或者,每个 Get 方法是否应该在方法内打开和关闭连接?我已经定时执行,并且使用传递的单个连接更快。不是一吨。我更关心现在有正确的方法。

另外,保持打开和关闭连接对数据库有什么影响?

4

1 回答 1

1

ADO.NET 使用 aconnection pooling来提高性能(对于 SQL 服务器来说确实如此,请查看您的数据库提供程序文档是否支持连接池)。因此,当您创建一个新的 SqlConnection 时,您实际上并没有打开与数据库的物理连接。您只是从连接池中绘制现有连接。当您在现有连接上调用 .Dispose 时,您实际上并没有关闭与数据库的物理连接。您只是将此连接返回到连接池,以便可以重用它。

因此,每当您想向数据库发送查询时,您都可以安全地编写以下代码:

using (var conn = new SqlConnection(ConnectionString))
using (var cmd = conn.CreateCOmmand())
{
    // no, you are not opening a real connection here, you are just drawing one from the pool
    conn.Open();
    cmd.CommandText = "SELECT ....";
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // ...
        }
    }
} // No, you are not closing the connection here, you are simply returning it to the pool

所以基本上,如果您的 ADO.NET 提供程序支持连接池(通常所有受尊重的提供程序都应该支持),您就不需要存储对 SQL 连接的任何引用。只需调用构造函数并传递连接字符串。因此,连接字符串就是您所需要的。

备注:连接池是按 AppDomain 和每个连接字符串完成的。这意味着如果您有 2 个不同的连接字符串连接到同一个数据库,并且您将这 2 个连接字符串传递给不同的 SQL 连接实例,您将获得每个连接字符串的连接池(即 2 个池)。

于 2012-12-13T21:59:14.937 回答