3

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

SQLConnection Connection;

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

然后我在方法中使用“this.Connection”,最后在不再需要对象时使用 this.Connection.Close() 和 Dispose()。据我所知,在这样的每个方法中使用“使用”会更干净(构造函数只会设置连接字符串):

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

由于连接池,实际上只使用了一个连接,尽管上面的“使用”行被放置在多个方法中(例如,当它们被一个接一个地调用时),对吗?但是,这不会创建许多只需要一个的 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 的正确、最佳方式是什么?

4

1 回答 1

5

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

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

现在,创建大量 Connection 类型的实例不是问题的原因是因为在 .NET CLR 中创建对象是经过优化的(快速内存分配和对象实例化)并且相对无痛(无需担心释放内存,这要归功于垃圾收集).. 在使用 ADO.NET 提供程序的情况下,您还可以享受连接池的好处,因此您不必担心管理此类型的实例数量。

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

于 2013-01-30T16:31:28.540 回答