6

我见过有人在做的例子:

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

4 回答 4

13

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

IDisposable然而,我会缓和这个建议,因为除了及时处理非托管资源之外,还有少数类型的实现。在某些非常特殊的情况下,您可以安全地跳过using. 然而,使用它几乎从来没有using,即使严格来说它不是必需的,所以我对你的建议是谨慎和过度使用,而不是使用不足using

于 2015-03-11T22:51:07.387 回答
9

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

于 2015-03-11T22:42:28.010 回答
2

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

考虑一种显式处理对象的方法,而不是将其留给编译器,这样您就可以说这是更好的做法。

于 2015-03-11T01:24:42.490 回答
0

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

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

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

在实践中,您可以跳过对 SqlServer 和 Oracle 参数的“使用”。

于 2015-03-12T11:25:05.183 回答