繁体   English   中英

应该使用“使用”声明吗?

[英]Should dapper use a “using” statement?

我见过有人在做的例子:

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();
}

正如其他人已经正确指出的那样,一般的最佳实践是在对象实现IDisposable任何时候using并且您知道对象的生命周期将会很短 - 也就是说,不会超过当前方法的持续时间。 这样做可确保及时清理稀缺的操作系统资源。 即使对象的处理由其终结器“支持”,您也不希望处于这样的情况:例如,您对文件或数据库有锁定,或者在终结器运行几次之前不会释放从现在起十亿纳秒。

但是,我会通过说除了及时处理非托管资源之外的其他原因而实施IDisposable的少数类型,这样可以缓解这一建议。 在某些非常具体的情况下,您可以安全地跳过using 然而,这几乎是没有任何错误使用using ,即使它不是严格意义上讲必要的 ,所以我给你的建议是要慎之又慎的侧面和过度使用,而不是在使用using

Dapper对此没有看法; 你在这里using是数据库连接。 如果您已完成连接:您已完成连接。 基本上,是的,您可能应该using

使用语句的主要目的是释放非托管资源。当不再使用对象时垃圾收集器会自动释放分配给它的内存,但有时垃圾收集器不会释放文件,流或数据库连接等资源。例。

可以想象它是一种显式处理对象的方法,而不是将它留给编译器,因此你可以说它是更好的实践。

根据我使用Sql Server和Oracle的经验(使用ODP.Net驱动程序和MS驱动程序),您需要使用Connections,Commands和Transactions,否则如果除了最简单的数据库交互之外,您将很快耗尽连接池。生产环境(连接池通常约为50 - 200个连接)。

您可能不会注意到开发环境中的行为,因为debug =大量重新启动会清除池。

正如上面的Eric Lippert所说,使用IDisposable对象是一般的好习惯。

实际上,您可以在SqlServer和Oracle的参数上跳过“使用”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM