前段时间我为.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()
会产生什么开销。
连接池正在启用所以我认为开销很小,第二种方法应该是最佳实践,但我只是想确保我的假设是正确的。
答案 0 :(得分:8)
是的,这是最好的做法。 using
使您对Close()异常安全的调用。
创建(任何)对象的开销确实是最小的,对于短期对象(保留在GC生成0中)最小。
请注意,您不必再在using-block的末尾调用Close(),它会自动为您完成(Dispose == Close)。
答案 1 :(得分:1)
这部分是品味问题。只要您使用连接池,创建新的(回收池化连接)的开销将是最小的,因此通常建议的模式是根据需要创建新的连接对象。
如果你紧接着彼此运行几个命令,那么我认为没有理由为每个命令创建新的连接,但你应该避免长时间保持打开连接。
此外,您应该注意Dispose
方法将为您关闭连接。因此,无需同时调用Close
和Dispose
。由于using
子句在结束时会调用dispose,因此通常无需调用Close
。
答案 2 :(得分:1)
如果您不确定打开/关闭连接的成本,请让SqlConnection
成为您的类的成员变量,但是在类处理时创建类IDisposable
并处理SqlConnection