SqlConnection、连接池和工作单元的设计模式



很明显,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, "使用连接"部分。

建议在使用连接后始终关闭连接,以便将其返回到连接池。

最新更新