6

不久前,我为我的 .net 应用程序编写了一个 ORM 层,其中所有数据库行都由 .net 的子类表示DatabaseRecord。有许多方法Load(),例如Save()等。在我的初始实现中,我在DatabaseRecord例如的构造函数中创建了到数据库的连接

connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString
);

然后,我在访问数据库的方法的开头和结尾Open()调用SqlConnection 。Close()在我看来(作为熟悉编程但对 c# 和 .net 不熟悉的人)这似乎是最有效的做事方式 - 建立一个连接并在课堂内必要时打开/关闭它。

不过,我刚刚读了一些书,似乎在很多地方都推荐了这种模式:

using (var connection = new SqlConnection(...)) {
    connection.Open();
    // Stuff with the connection
    connection.Close();
}

我明白为什么它是可取的 -Dispose()即使您在中间所做的事情导致未捕获的异常,连接也会自动进行。我只是想知道new SqlConnection()像这样多次调用的开销是多少。

连接池已启用,因此我认为开销很小,第二种方法应该是最佳实践,但我只是想确保我的假设是正确的。

4

3 回答 3

8

是的,这是最佳实践。这using使您对 Close() 异常安全的调用。

并且创建(任何)对象的开销确实是最小的,对于短期对象(停留在 GC 第 0 代)来说也是最小的。

请注意,您不必再在 using 块的末尾调用 Close(),它会自动为您完成(Dispose==Close)。

于 2010-01-07T11:51:47.160 回答
1

这部分是口味问题。只要您使用连接池,创建新连接(回收池连接)的开销就会很小,因此通常推荐的模式是根据需要创建新的连接对象。

如果您一个接一个地运行多个命令,那么我认为没有理由为每个命令创建新连接,但您应该避免长时间保持打开连接。

此外,您应该注意该Dispose方法将为您关闭连接。所以没有必要同时调用CloseDispose。由于using子句在结束时会调用 dispose,因此通常不需要调用Close.

于 2010-01-07T11:53:42.517 回答
1

如果您不确定打开/关闭连接的成本,SqlConnection请使用您的类的成员变量,但在处理类IDisposable时创建类并处理 SqlConnection

于 2010-01-07T11:53:56.727 回答