【问题标题】:Design Patterns for SqlConnection, connection pooling and unit of worksSqlConnection、连接池和工作单元的设计模式
【发布时间】:2011-11-22 07:16:07
【问题描述】:

很明显,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);
}

这可能发生在页面加载期间,应该从数据库中获取多个数据。

【问题讨论】:

  • 一般准则是关闭连接 a.s.a.p。但是,如果工作单元内的所有操作都必须在单个数据库事务中执行,那么您别无选择:您需要使用单个连接并使其保持打开状态。
  • 是的,我明白这一点,也是使用连接的最简单方法,所以我对此感到非常高兴。

标签: c# asp.net sql-server design-patterns unit-of-work


【解决方案1】:

请注意,使用连接池,您实际上并没有为每个“新”创建新连接...您通常只是从池中获取一个。

因此,您应该始终尽可能晚地打开连接,并尽可能早地关闭它们。

如果一组命令需要成为一个事务的一部分,则需要一起完成。但除此之外,我认为您应该始终在完成后关闭并获得一个新的。

即使您在这些命令之间没有运行其他代码......如果在它们之间发生线程上下文切换怎么办?您的连接对象不必要地打开,什么都不做,等待重新获得控制权。

如果你关闭了它,它可能会回到池中。

【讨论】:

    【解决方案2】:

    在我看来,如果您已经准备好执行一些查询,那么使用单个连接来执行多个查询就可以了。

    如果您在不久的将来有一些想要通过已经打开的连接执行的查询,不建议保持连接打开。在这种情况下,建议尽快关闭连接,并为将来的查询建立一个新连接

    【讨论】:

    • 我对此采取了更严格的方法:完成一笔交易后始终关闭。有关更多信息,请参阅我的答案。
    【解决方案3】:

    Microsoft http://msdn.microsoft.com/en-us/library/ms971481.aspx 有很好的链接,“使用连接”部分。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 2014-12-27
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多