跨多个方法使用SQLConnection(是否使用“using”关键字)

3

我希望在类中不同的方法之间重复使用同一个SQLConnection。目前我正在做的事情(仅作测试)是在构造函数中创建和打开连接:

SQLConnection Connection;

Constructor(string connection_string)
{
    this.Connection = new SqlConnection(connection_string);
    this.Connection.Open();
}

然后我在方法内部使用“this.Connection”,最后在对象不再需要时使用this.Connection.Close()和Dispose()。据我所知,更好的做法是在每个方法内使用“using”进行连接,如下所示(构造函数仅设置连接字符串):

using (SqlConnection connection = new SqlConnection(connection_string)) {
 connection.Open(); ...
}

由于连接池的存在,尽管上面的“using”语句被放置在多个方法中(例如当它们一个接一个地被调用时),实际上只使用了一个连接,对吗?然而,这样不会创建许多SQLConnection实例,而只需要一个实例,是吗?例如:
MyClass obj(some_string);
obj.Method1(); // calls 'using SqlConnection connection = new SqlConnection'
obj.Method2(); // calls 'using SqlConnection connection = new SqlConnection'
obj.Method3(); // calls 'using SqlConnection connection = new SqlConnection'

那么,分享SQLConnection的正确和最佳方法是什么?


3
请看@TimSchmelter在这里的回答。 - Austin Salonen
1
构造函数不应执行长时间运行的操作,例如打开到数据库的连接。此外,我倾向于从静态(或基于需要的单例)获取连接字符串,而不是传递到构造函数中。这样可以避免冗长的数据访问层,并提供一个统一的更新位置。 - P.Brian.Mackey
...只是为了让它成为一个已知未知:确保您也正确处理数据库事务处理/工作单元,这留给读者作为练习。 - mwardm
1个回答

5
你的所有说法都是正确的。不过,你漏掉了一个重要的观点:在.NET中创建多个类型实例并不一定是坏事
  • 构造函数中不应该创建单个连接实例
  • 当需要时,应该本地创建连接
  • 最佳实践是在创建一次性对象时使用using范例
  • 应习惯于在try...finally块中调用可处理对象的Dispose方法(如果不使用using)——以防特定情况不适合使用usings,例如使用异步方法
  • 最后,不应该让SQL连接保持打开状态比所需时间长。同样,在ADO.NET提供程序为SQL Server的情况下,只需利用连接池即可

现在,之所以创建Connection类型的大量实例并不成问题,是因为在.NET CLR中创建对象是经过优化的(快速内存分配和对象实例化),相对而言不会带来太多麻烦(由于垃圾回收,无需担心释放内存)。此外,如果使用ADO.NET提供程序,则还有连接池的好处,因此你不必担心管理此类型的实例数量。

很明显,在其他情况下(例如重型/大型对象),创建大量对象可能会对内存压力和性能产生影响。因此,应尽可能仔细地评估情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接