SqlConnection、连接池和工作单元的设计模式
本文关键字:单元 设计模式 工作 连接 SqlConnection | 更新日期: 2023-09-27 18:15:18
很明显,SqlConnections是池化的,所以using
关键字看起来很完美,这是我一直使用和看到使用的方法。
public List<string> MyQuery()
{
List<string> list = new List<string>();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
// do some stuff with connection, process the resultset and fill the list.
}
return list;
}
问题是:对于一个网页的几个查询,是每次创建连接更好,还是在查询之间共享连接,为一个工作单元共享它?
性能会大得多还是只是一个过早的不必要的微优化?
尽快关闭每个连接真的很重要吗?还是最好尝试将所有查询打包到一个工作单元中?
一个工作单元的例子可以是…
List<string> list1, list2;
string myvalue1, string myvalue2;
using (SqlConnection conn = new SqlConnection(connection))
{
list1 = MyQuery1(conn);
list2 = MyQuery2(conn);
myvalue1 = MyQuery3(conn);
myvalue2 = MyQuery4(conn);
}
这可能发生在页面加载时,需要从数据库中获取多个数据。
注意,使用连接池,您实际上并没有为每个'new'…创建新的连接。你通常只从池中得到一个。
因此,您应该总是尽可能晚地打开连接,并尽可能早地关闭它们。
如果一组命令需要成为一个事务的一部分,那么它需要一起完成。但除此之外,我认为你应该总是关闭当你完成,并得到一个新的。
即使在这些命令之间没有其他代码运行…如果在两者之间发生线程上下文切换怎么办?您的连接对象不必要地打开,什么也不做,等待重新获得控制权。
如果你关闭了它,它可能会回到池中。
在我看来,如果你已经有几个查询准备执行,那么使用一个连接来执行多个查询是很好的。
如果您在不久的将来要通过已经打开的连接执行一些查询,则不建议保持连接打开。在这种情况下,建议尽快关闭连接,并为执行以后的查询创建一个新连接
有一个很好的链接来自微软http://msdn.microsoft.com/en-us/library/ms971481.aspx, "使用连接"部分。
建议在使用连接后始终关闭连接,以便将其返回到连接池。