在c#中创建新SqlConnection的开销

时间:2010-01-07 11:48:02

标签: c# .net database sqlconnection

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

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

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

我刚刚做了一些阅读,似乎在很多地方推荐这种模式:

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

我可以看到为什么它是可取的 - 即使您在中间执行的操作导致未捕获的异常,连接也会自动Dispose() d。我只是想知道有多少次像这样调用new SqlConnection()会产生什么开销。

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

3 个答案:

答案 0 :(得分:8)

是的,这是最好的做法。 using使您对Close()异常安全的调用。

创建(任何)对象的开销确实是最小的,对于短期对象(保留在GC生成0中)最小。

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

答案 1 :(得分:1)

这部分是品味问题。只要您使用连接池,创建新的(回收池化连接)的开销将是最小的,因此通常建议的模式是根据需要创建新的连接对象。

如果你紧接着彼此运行几个命令,那么我认为没有理由为每个命令创建新的连接,但你应该避免长时间保持打开连接。

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

答案 2 :(得分:1)

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