dapper 应该使用 "using" 语句吗?

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

using statments的主要用途是释放非托管resources.When一个对象不再被使用垃圾收集器会自动释放分配给它的内存但有时垃圾收集器不会释放文件等资源,像您的示例中的流或数据库连接。

将其视为一种显式处理对象的方法,而不是将其留给编译器,因此您可以说这是更好的做法。

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

正如其他人正确指出的那样,一般而言,最佳做法是在对象实现 IDisposable 的任何时候使用 using 并且您知道对象的生命周期将很短 -也就是说,不长于当前方法的持续时间。这样做可以确保及时清理稀缺的操作系统资源。即使一个对象的处置是由它的终结器 "backstopped" 进行的,你也不希望处于这样一种情况,比如说,你锁定了一个文件或数据库,或者在终结器之前不会释放的东西从现在开始运行数十亿纳秒。

但是我会缓和这个建议,说有少数类型实现 IDisposable 是出于及时处置非托管资源之外的其他原因。在某些 非常具体的 情况下,您可以安全地跳过 using。但是,使用 using 几乎永远不会 错误 ,即使严格来说 不需要 ,所以我给你的建议是在谨慎和过度使用方面犯错误,而不是使用不足 using.

根据我使用 Sql Server 和 Oracle(使用 ODP.Net 驱动程序和 MS 驱动程序)的经验,您需要使用 using around Connections、Commands 和 Transactions,否则您很快就会耗尽连接如果您在生产环境中除了执行最简单的数据库交互之外还做任何事情,请使用连接池(连接池通常为 ~50 - 200 个连接)。

您可能不会注意到开发环境中的行为,因为调试 = 多次重新启动,这会清除池。

正如上面的 Eric Lippert 所说,在 IDisposable 对象周围使用 using 通常是一种很好的做法。

实际上,您可以跳过 "using" SqlServer 和 Oracle 的参数。