在 .NET Web 中使用 Dapper 重用数据库连接 API

Reusing database connection with Dapper in .NET Web API

我见过的大多数(如果不是全部的话).NET 中的 Dapper 示例都使用如下结构:

    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Query<T>(sql, param);
    }

如果您有 Web API ,每次向服务器发出请求时都建立一个新连接是否明智?或者将连接抽象到另一个 class 并将其注入每个控制器以便它们使用相同的连接是更好的模式。

从表面上看,重用连接似乎会导致更快的响应,但我不知道 SqlConnection 对象中发生的事情的本质,所以我不确定这是否是个好主意。

该代码具有误导性。在大多数情况下,您这样做实际上并不是在创建 new 连接。默认情况下 pooling 为连接启用,除非您明确告诉它不要。

我不是 100% 确定池背后的确切标准,但要点是,如果您在代码中快速重复使用相同的连接字符串,池实际上应该只创建一个从您的应用程序到 SQL 服务器,而不是每次 new SqlConnection 并打开它时都创建一个新连接。

通过处理连接,您基本上表示该特定使用已完成....因此维护池背后的逻辑可以知道您已完成该特定连接。同样,我不确切知道池是如何实现的,但我想它在内部跟踪你的代码建立了多少连接,以便它可以决定是否保持与 ​​SQL 服务器的实际连接打开。

有同样的疑问,也是这样实现的。这将被注册为 Transient Service with DI

public class GenericRepository<T> : IGenericRepository<T>, IDisposable where T: class
{
    private readonly IDbConnection connection;

    public GenericRepository()
    {
        connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"]);
        connection.Open();
    }

    public virtual T QueryFirstOrDefault<T>(string sql, object parameters = null)
    {
        return connection.QueryFirstOrDefault<T>(sql, parameters);
    }

    public void Dispose()
    {
        connection.Close();
        connection.Dispose();
    }
}