SQLConnection 实例通过 Dapper 处理

Posted

技术标签:

【中文标题】SQLConnection 实例通过 Dapper 处理【英文标题】:SQLConnection instances dispose via Dapper 【发布时间】:2021-09-09 14:18:14 【问题描述】:

我在我的项目中使用ASP.NET web forms unity 进行 DI:

接下来,我在我的项目中安装了Dapper,以通过我的 DAL 调用数据库资源。在我的 Startup 类中,我像这样插入了 IDbConnection,以便 Dapper 可以在任何地方使用该 IDbConnection:

 container.RegisterInstance<IDbConnection>(new SqlConnection(connectionString));

我这里的问题是,如果我在课堂上使用这样的dbconnection,那么工作完成后sql连接将如何处理:

public class MyProvider: IMyProvider

    private readonly IDbConnection _dbConnection;
    public MyProvider(IDbConnection dbConnection)
    
        _dbConnection = dbConnection;
    

    public async Task<IEnumerable<MyData>> GetMyData()
    
        const string sql = @"SELECT * from mytable";

        return await _dbConnection.QueryAsync<Content>(sql);
    

在设置 DI 挂钩时,我在启动时担心这部分“(new SqlConnection(connectionString))”。调用数据库调用后如何以及何时释放 SQLConnection。上面的代码中没有任何地方写using

Dapper 会在调用后处理 SQLConnection 吗?如果没有,那你能分享一下如何在进行 dapper 调用后转换上面的代码来处理 SQL 连接吗?

【问题讨论】:

【参考方案1】:

它不会被释放,因为该实例实际上是一个 Singleton,并且在应用程序的整个生命周期内都会被保留。这不是注入数据库连接的正确方法。

你应该注册一个工厂方法,使用RegisterFactory

container.RegisterFactory<IDbConnection>(f => new SqlConnection(connectionString));

然后您可以使用它来获得一个 连接并将其放置在using 块中。

【讨论】:

但是它不会被处置/终身持有有关系吗?处置实际上是关闭的同义词,dapper 将打开和关闭(不处置)连接作为其操作的一部分,从池中租用并返回一些打开的 TCP 连接,因此除非在仍然尝试执行另一个查询时枚举第一个的结果,我不确定是否重用单个实例或是否创建新实例会有很大的不同.. @CaiusJard 可能是,但是等到有人多线​​程它......无论如何,只是感觉不对,但每个人都有权发表自己的意见

以上是关于SQLConnection 实例通过 Dapper 处理的主要内容,如果未能解决你的问题,请参考以下文章

用了Dapper之后通篇还是SqlConnection,真的看不下去了

在 Dapper.NET 中调整 CommandTimeout?

Dapper 条件语句(Where) 中参数使用

我应该使用多少个 SqlConnection 实例

SqlConnection 卡在命名管道上

ADO.NET_SqlConnection类,SqlCommand类,SqlDataReader类