跨多种方法使用 SQLConnection("using"关键字 yes 或 no)



我想在类中重复使用相同的SQLConnection不同的方法。我现在正在做的(仅测试)是在构造函数中创建并打开连接:

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

然后我使用"这个。连接"里面的方法,最后用这个。Connection.Close() 和 Dispose() 在不再需要该对象时。据我所知,在每个方法中使用"using"会更干净,例如(构造函数只会设置connection_string):

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 的正确、最佳方法是什么?

你所有的陈述都是正确的。但是,您错过了重要的一点:在 .NET 中创建大量类型的实例并不一定是一件坏事

  • 不应在构造函数中创建单个连接实例
  • 在需要时在本地创建连接
  • 最佳做法是在创建一次性对象时使用using范例
  • 你应该养成在try...finall块中的一次性对象上调用 Dispose 的习惯(如果不使用 using ) - 以防您的特定场景不适合使用 usings ;例如使用异步方法)
  • 最后,保持 SQL 连接打开的时间不应超过您需要的时间。同样,只需利用 SQL Server ADO.NET 提供程序中的连接池

现在,创建大量连接类型的实例不是问题的原因是,在 .NET CLR 中创建对象经过优化(快速内存分配和对象实例化)并且相对无痛(无需担心由于垃圾回收而释放内存)。对于 ADO.NET 提供程序,您还可以获得连接池的好处,因此实际上,您不必担心管理此类型的实例数。

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

最新更新