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

标签 c# .net using sqlconnection

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

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 实例吗?例如:

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 block 中对一次性对象调用 Dispose 的习惯(如果不使用 using)-如果您的特定场景不适合使用 usings;例如使用异步方法)
  • 最后,您不应保持 SQL 连接打开的时间超过您需要的时间。同样,只需利用 SQL Server 的 ADO.NET 提供程序中的连接池

现在,创建大量 Connection 类型的实例不是问题的原因是因为在 .NET CLR 中创建对象是优化的(快速内存分配和对象实例化)并且相对轻松(无需担心释放多亏了垃圾收集的内存)。在 ADO.NET 提供程序的情况下,您还可以享受连接池的好处,所以实际上,您不应该担心管理这种类型的实例数量。

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

关于c# - 跨多个方法使用 SQLConnection ('using' 关键字是或否),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608840/

相关文章:

c# - ASP.NET 'CheckAllCB' 复选框 header 模板不起作用

c# - 我正在尝试使用 backgroundworker 但它不起作用 - 为什么?

c# - 什么时候自动复制记录结构?

.net - 如何解决 ASP.NET 和 SQL Server 之间的连接池问题?

c# - 没有await的using语句中的async,这安全吗?

c# - 将整个对象从 View 传递到 ASP.NET MVC 5 中的 Controller

c# - List.Contains 对象比较失败

.net - Azure 应用服务指定每个插槽或应用服务的 Web Config

c# - 我要处理我的 ODBCConnection

C++11:为什么私有(private)成员模板可以在类外访问?