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,真的看不下去了