【问题标题】:Should I persist a sqlconnection in my data access layer?我应该在我的数据访问层中保留一个 sqlconnection 吗?
【发布时间】:2008-10-29 15:28:14
【问题描述】:

似乎快速打开和关闭 sqlconnections 涉及很多开销。我应该保持一个连接(一个,每个客户端,每个数据库),还是在需要时继续声明一个新的 sqlconnection 对象,并确保我自己清理干净?

你做了什么?什么效果好什么效果不好?

【问题讨论】:

  • 连接池中的连接何时超时?
  • 您可以通过连接字符串名称/值来控制它:msdn.microsoft.com/en-us/library/…。向下滚动到包含“连接生命周期”的第二个表格。

标签: .net sql ado.net


【解决方案1】:

在大多数情况下,.NET 连接池会为您处理这个问题。即使您通过代码打开和关闭连接,这也不是幕后发生的事情。当您实例化并打开一个连接时,.NET 会在连接池中查找具有相同连接字符串的现有连接,然后将其提供给您。当您关闭连接时,它会返回到连接池以供将来使用。

如果您使用的是 SQL Server:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

OLE DB、ODBC、Oracle:http://msdn.microsoft.com/en-us/library/ms254502.aspx

Dino Esposito 文章:http://www.wintellect.com/Articles/ADO%20NET%20Connection.pdf

您可以使用连接字符串名称/值覆盖默认池行为:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx。请参阅包含“连接生命周期”的第二个设置表。

【讨论】:

  • 有趣,不知道。
【解决方案2】:

没有太多开销,因为在默认设置下,池存储在连接池中。因此,当您打开一个连接时,通常您只会从池中获得一个准备好的连接。创建 SqlConnections 并没有给我带来任何麻烦。

【讨论】:

    【解决方案3】:

    如果您使用相同的连接字符串,您的连接将被合并。您应该只在需要时打开连接。

    【讨论】:

      【解决方案4】:

      我确实有同样的想法,所以我在一个紧密的循环中使用了相同的连接,以防止在需要时必须实例化另一个连接。但是有时很难跟踪它并进行调试,如果您从连接中获取一个 DataReader,然后在同一个阅读器仍然处于活动状态时尝试做另一个,那么您将得到异常。所以,我只推荐它,如果它真的很频繁,就像一个紧密的循环,否则它不值得麻烦。

      【讨论】:

        【解决方案5】:

        这通常不是一件好事(您可能会导致泄漏并最终耗尽连接),而是依赖连接池来提高性能并根据需要打开连接并尽快关闭连接。

        Bill Vaughn 有许多关于连接池和数据访问的有用文章,包括 this one

        【讨论】:

          【解决方案6】:

          多年来,我们让客户端保持与数据库的单一持久连接。问题在于检测间歇性连接失败并正常重新连接。很多时候,在您尝试使用连接之前,您不会知道连接失败(即发出 select 将引发“一般 SQL 错误”)

          我们现在使用一个全局可用的静态类,它的工作是为您提供与数据库的新连接,当您完成它时,您可以使用同一个类来摆脱连接。

          DbConnection conn = Database.GetConnection();
          try
          {
             //do stuff with the connetion
             ...
          }
          finally
          {
             Database.DisposeConnection(conn);
          }
          

          我们这样做是因为当我们连接到数据库时需要初始化(我们存储的信息是 SQL Server 的 CONTEXT_INFO,当我们断开连接时必须清空该信息)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-28
            • 2012-08-30
            • 2012-12-11
            • 1970-01-01
            • 1970-01-01
            • 2015-04-27
            • 1970-01-01
            相关资源
            最近更新 更多