跨多个方法使用SQLConnection('使用'关键字是或否)

时间:2013-01-30 16:26:49

标签: c# .net using sqlconnection

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

SQLConnection Connection;

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

然后我在方法中使用“this.Connection”,最后在不再需要该对象时使用this.Connection.Close()和Dispose()。据我所知,在每个方法中使用'using'会更加清晰(构造函数只会设置connection_string):

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

由于连接池,实际上只使用了一个连接,尽管上面的“使用”行放在多个方法中(例如,当它们被一个接一个地调用时),是否正确?但是,这不会创建许多只需要一个的SQLConnection实例吗? E.g:

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的最佳方式是什么?

1 个答案:

答案 0 :(得分:4)

您对所有陈述都是正确的。但是你遗漏了一个重点:在.NET中创建大量类型的实例并不一定是坏事

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

现在,创建大量Connection类型实例并不是问题的原因是因为.NET CLR中的对象被优化(快速内存分配和对象实例化)并且相对无痛(无需担心发布)内存感谢垃圾收集)..在ADO.NET提供商的情况下,你也有连接池的好处,所以你不应该关心管理这种类型的实例数。

显然,在其他情况下(例如重型/大型物体),产生大量物体会对内存压力和性能产生影响。因此,请尽可能地评估情况。