Dapper是否应该使用"using"语句?

9

我曾见过有人这样做:

IDbConnection db = new MySqlConnection(conn);

var people = db.Query<People>("SELECT * FROM PEOPLE").ToList();

或者上面的做法是不好的吗?所有查询都应该使用如下语句吗:
using (var db = new MySqlConnection(conn))
{
var people = db.Query<People>("SELECT * FROM PEOPLE").ToList();
}

在连接周围加上 using。 - CRice
4个回答

17

正如其他人正确指出的那样,总体上最佳实践是在对象实现 IDisposable 并且您知道对象的生命周期将很短,也就是说不会超过当前方法的持续时间时使用 using。这样做可以确保稀缺的操作系统资源及时清理。即使对象的处理被其终结器 "后备",您也不希望出现这样的情况,例如,您锁定了文件或数据库等某些东西,直到终结器从现在开始运行数十亿纳秒。

然而,我要缓和这个建议,因为有一小部分类型实现了 IDisposable,但其原因并非为了及时处理非托管资源。在某些非常特殊的情况下,您可以安全地跳过 using。但是,即使在不严格需要的情况下,使用 using 几乎永远都不会是错误的,所以我的建议是,要谨慎使用 using,而不是少用它。


1
另外,我想提一下 Stephen Toub 的文章,关于如何处置 .Net Tasks:Do I need to dispose of Tasks? - Luca Cremonesi

10

Dapper没有对此进行评论;您在这里正在使用的是数据库连接。如果你已经完成了连接:你就完成了连接。基本上,是的,你可能应该使用using


2

使用`using`语句的主要目的是释放非托管资源。当一个对象不再使用时,垃圾回收器会自动释放为其分配的内存,但有时候垃圾回收器不会释放一些资源,比如文件、流或者数据库连接,就像您的例子。

把它看作一种显式处理对象而不是交给编译器来处理的方式,这可以说是更好的实践。


不释放您确定不再使用的资源是一个不好的做法。 - Mephy
1
我知道垃圾回收器的作用,并且我一直听到人们说‘using’语句应该经常与'connections'一起使用,这样只有在需要时它们才会保持打开状态,并释放回‘connection pool’。为什么要完全依赖于垃圾回收器,当你可以将连接放在using语句中呢?我的更关心的是,dapper是否在幕后执行此操作? - xaisoft
1
为什么要严格依赖垃圾回收器?因为你不能完全依赖它。 - zerkms
@xaisoft 我的回答不是很具体,但这是更好的实践,所以尽可能使用IDisposable。 - meda
@zerkms - 这是一个修辞问题。 - xaisoft

0
在我使用 Sql Server 和 Oracle(使用 ODP.Net 驱动程序和 MS 驱动程序)的经验中,您需要在连接、命令和事务周围使用 using,否则在生产环境中进行任何不是最简单的数据库交互时,您很快就会耗尽连接池(连接池通常为 ~50-200 个连接)。
您可能在开发环境中没有注意到这种行为,因为调试=大量重启,这会清除池。
正如 Eric Lippert 上面所说,通常最好在 IDisposable 对象周围使用 using。
实际上,您可以跳过对 SqlServer 和 Oracle 的参数使用 "using"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接