代码之家  ›  专栏  ›  技术社区  ›  fluf

在sqlconnections上使用'using'的性能影响是什么?

  •  2
  • fluf  · 技术社区  · 15 年前

    我遇到一个 article 这样使用我的sqlconnection:

    using (SqlConnection sqlConnection = new SqlConnection(Config.getConnectionString()))
                {
                    using (SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sqlConnection))
                    {
                        dataAdapter.Fill(dataSet);
                    }
                }
    

    提高性能,因为它在方法的末尾处理对象。所以我用“使用”编码已经有一段时间了,在与其他开发人员聊天后,他们说多次创建和破坏实例并不能真正提高性能。

    如果我对所有数据访问方法都使用“using”,那么对SQLServer和系统资源的性能影响是什么?由于连接被多次连接和重新连接,SQLServer会受到更大的冲击吗?

    6 回复  |  直到 15 年前
        1
  •  12
  •   Marc Gravell    15 年前

    SqlConnection 默认情况下,已启用连接池。这个 Dispose() 只需尽快释放到池的连接。这意味着其他代码可以重新使用这个连接,减少到SQL Server的连接,并减少建立物理连接的时间。

    所以是的:它可以改善 总体的 性能。

    备选方案:

    • 如果您的代码干净地退出,并且您总是记住 Close() 连接,那么可能没有区别
    • 如果您的代码抛出了一个异常(您尚未处理),或者 忘记 关闭() 连接,然后您可以保留未使用的连接,直到有足够的内存压力触发GC和终结器。这可能意味着您需要更多到SQL Server的物理连接(这很麻烦),并且每次 新的 基础连接是必需的,它必须承受建立 实际的 数据库连接

    总的来说,尽管-想想 IDisposable 作为合同,它是你的 工作 作为一个.NET开发者要注意 不可分的 资源,并积极 处置() 完成后,最好是 using 如果使用范围很窄(如本例中)。

        2
  •  3
  •   marc_s    15 年前

    在大多数情况下,它对性能没有显著影响。

    所有的使用()…构造确保 SqlConnection 在完成任务后释放/释放。仅此而已-没有魔法性能提升……

    当然-创建和处理对象确实需要一些性能-要么就是这样,要么就是不必要地将对象保存在内存中,并将与SQL Server的连接打开的时间比需要的时间长得多。

    我会投票赞成使用 using() {...} 接近100%的时间-它更干净,更安全,只是更好的编程实践。你可能会受到的“打击”是微小的,不值得麻烦。

    马克

        3
  •  0
  •   Christian Hayter    15 年前

    它提高了性能 只有 从某种意义上说,在释放连接实例之后,池中的物理连接可以被另一个线程重用。如果您保持它打开,那么另一个试图打开连接的线程将向池添加新的物理连接。

        4
  •  0
  •   Vitaliy Liptchinsky    15 年前

    ADO.NET具有连接池等功能,因此,如果您集中打开连接,则很可能不会释放连接,只会返回到池中。

        5
  •  0
  •   Guffa    15 年前

    如果您在彼此之后执行多个数据库操作,则应使用相同的连接,而不是为每个连接创建一个连接。否则,您应该尽快关闭连接,以便将其返回到连接池并可以重用。

    你应该总是使用 using 阻止连接,以确保它们正确关闭。如果关闭连接对象失败,它将一直保留在内存中,直到垃圾收集器将其移除,从而占用数据库连接。这意味着下一个操作无法重用池中的连接,但必须建立一个全新的连接,这需要更长的时间。

        6
  •  0
  •   anishMarokey FIre Panda    15 年前

    性能有所提高。

    如果你使用 using

    例如:

    using (SqlConnection sqlConnection = new SqlConnection("ConnectionString"))
        {
        }
    

    编译器自动添加try-and-finally。

    alt text http://img111.imageshack.us/img111/4514/using.jpg