最好是传递一个打开的SqlConnection作为参数,还是在每个方法中调用一个新的参数
本文关键字:一个 参数 调用 方法 SqlConnection | 更新日期: 2023-09-27 18:28:27
如果我要调用的方法/函数需要打开SqlConnection,我会在调用该函数的方法中打开它。例如:
protected static void btnSubmit(){
conn.Open();
myMethod(someParam, conn);
conn.Close();
}
protected static void myMethod(object someParam, SqlConnection conn){
//Some SQL commands etc here..
}
我这样做是为了我:
- 每个进程只能打开和关闭1个SqlConnection
然而,这样构造我的代码会更好吗:
protected static void btnSubmit(){
myMethod(someParam);
}
protected static void myMethod(object someParam){
SqlConnection conn = New SqlConnection(".....");
conn.Open();
//Some SQL commands etc here..
conn.Close();
}
我认为以这种方式构建它的优势是:
- 我不必为每个方法传递额外的参数
- 如果以后该方法不再有SQL命令,则每次都不会调用未使用的参数
我看到的缺点是:
- 如果
myMethod
是一个递归方法,那么当它调用自己时,它将打开另一个SqlConnection
,依此类推 - 如果
btnSubmit
正在调用多个方法,这些方法都需要SqlConnection,那么每个方法都将打开和关闭一个新的连接
做到这一点的最佳方法是什么,最常用的方法是什么?
ADO.NET使用连接池,因此即使您认为正在打开新连接,它也会自动重用现有的已打开连接。考虑到这一点,实际上没有理由通过代码传递连接(作为参数)。这将使您的代码更加干净,具有与将连接作为参数传递时相同的性能。
更多详情点击此处
此外(这一点非常重要),请使用"使用"关键字。这样,您就不必处理关闭连接和清理的问题,因为您现在编写的代码不处理关闭连接的问题,所以在出现异常的情况下,您可能会在服务器上达到连接限制。选择这样的东西:
using(var connection = new SqlConnection(<connection_string>))
{
connection.Open();
using(var command = connection.CreateCommand())
{
}
}
正如您所看到的,不需要调用连接。Close()或处理异常并关闭finally
块中的连接,因为这是"正在使用"块的"作业"。
还有一个重要的注意事项。。。事务不是通过连接轮询传递的,所以如果你想在方法调用之间保持事务,你必须传递你的连接(这是我能想到为什么你应该这样做的唯一原因)。
使用的最佳模式是Repository+UnitOfWork模式。
因此,存储库被创建并传递包含连接的UnitOfWork。工作完成后,UnitOfWork将被处理。
// Pseudocode
using(UnitOfWork uow = new UnitOfWork())
{
Repository.Init(uow);
Repository.SaveInDb(stuff);
}
工作单位:
// PseudoCode
class UnitOfWork : IDisposable
{
public UnitOfWork()
{
conn = new SqlConnection();
conn.Open();
}
public void Dispose()
{
conn.Close();
}
....
}
这是我一直使用的。
有些人更喜欢Repository拥有连接的简单方法。这更简单,但如果您需要跨多个存储库进行事务,它将不起作用。