我想在类中的不同方法中重复使用相同的 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/