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

我见过的大多数(即使不是全部).NET中的Dapper示例都使用这样的结构:

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

如果您具有Web API,那么每次对服务器发出请求时建立新连接是否明智?还是将连接抽象为另一个类并将其注入到每个控制器中,以便他们使用相同的连接是更好的模式。

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

dangwan1 回答:在.NET Web API中使用Dapper重用数据库连接

该代码具有误导性。在大多数情况下,您实际上并不是在创建 new 连接。默认情况下,除非您明确指示不启用连接,否则pooling会被启用。

我不能100%地确定缓冲池背后的确切条件,但是要点是,如果您在代码中快速重用相同的连接字符串,那么缓冲池实际上只能创建一个从您的应用程序到SQL Server的连接,而不是每次执行new SqlConnection并打开它时都创建一个新连接。

通过处置连接,您基本上是在发出特定使用已完成的信号。...因此维护池的逻辑可以知道您已完成该特定连接。再次,我不知道确切地实现池化的方式,但是我想它在内部跟踪从您的代码建立了多少连接,以便它可以决定是否保持与SQL Server的实际连接打开。

,

有同样的问题并以这种方式实施。这将在 DI 处注册为 Transient Service

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();
    }
}
本文链接:https://www.f2er.com/3149176.html

大家都在问