我应该何时打开和关闭与 SQL Server 的连接

Posted

技术标签:

【中文标题】我应该何时打开和关闭与 SQL Server 的连接【英文标题】:When should I open and close a connection to SQL Server 【发布时间】:2010-10-26 01:58:43 【问题描述】:

我有一个简单的静态类,其中包含一些方法。这些方法中的每一个都打开一个 SqlConnection,查询数据库并关闭连接。这样,我确信我总是关闭与数据库的连接,但另一方面,我不喜欢总是打开和关闭连接。下面是我的方法的示例。

public static void AddSomething(string something)

    using (SqlConnection connection = new SqlConnection("..."))
    
        connection.Open();
        // ...
        connection.Close();
    

考虑到方法在静态类中,我应该有一个包含单个 SqlConnection 的静态成员吗​​?我应该如何以及何时放弃它?最佳做法是什么?

【问题讨论】:

【参考方案1】:

不,除非必须,否则不要保留静态 SqlConnection。线程将是一个问题,但更重要的是 - 通常您根本不需要。使用您提供的代码,内部连接池意味着大多数时候您将在连续调用中获得相同的底层连接(只要您使用相同的连接字符串)。让 pooler 完成它的工作;不用管代码。

这也避免了当你开始有两个线程时发生的问题......现在每个线程都可以在自己的连接上工作;使用静态(假设您不使用[ThreadStatic]),您必须进行同步,从而引入延迟。更不用说重入(即单个线程尝试同时使用相同的连接两次)。对;不理会代码。现在很好,几乎你所做的任何改变都会让它变得不好。

【讨论】:

【参考方案2】:

因为当您调用 Open() 和 Close() 时 SqlConnection 有一个连接池,您实际上并没有打开和关闭与服务器的物理连接。您只是从可用连接池中添加/删除连接。因此,最好在执行命令后尽可能晚地打开连接并尽早关闭连接。

【讨论】:

说的很好!【参考方案3】:

在您的代码示例中,无需在连接对象上调用 close() 方法,因为代码位于 using 块内,它将自动处理。

【讨论】:

【参考方案4】:

大多数程序员都相信迟开早关。如果每次打开和关闭连接的延迟都会导致整个应用程序变慢,这只是一个问题。

在您使用静态类的情况下,最好每次都打开和关闭连接。

【讨论】:

+1 抵消反对票。即使是池重新打开也会导致调用 sp_resetconnection,这会导致一些(即使它很小)延迟。【参考方案5】:

您正在做最佳实践。仅在您要查询它之前打开它,并尽快关闭它。这种事情一开始可能看起来很浪费,但从长远来看,它实际上使您的应用程序更具可扩展性。

【讨论】:

这仅适用于可扩展性甚至可能的情况。对于,例如具有嵌入式数据库的应用程序将适用不同的注意事项。【参考方案6】:

永远不要依赖连接自行关闭。如果没有明确关闭,则会导致性能问题。它发生在我们的项目中。是的,我知道连接是由连接池管理的,但它们仍然必须关闭并返回到池中。

【讨论】:

他在 SqlConnection 周围有一个“使用”调用,所以它应该在连接完成后处理掉它

以上是关于我应该何时打开和关闭与 SQL Server 的连接的主要内容,如果未能解决你的问题,请参考以下文章

命名管道提供程序无法打开与 SQL Server 1231 的连接

Android SQLite DB 何时关闭

MS Access 查询设计在与 SQL Server 的连接上挂起

SQL Server 中的函数与存储过程

SQL Server IIF 与 CASE

使用 Java servlet 时何时打开以及何时关闭 mysql 连接?