连接池技术

4
我有以下代码,如果我在finally中使用conn == null,我仍然使用连接池吗? 我知道关闭连接是一个好习惯,但是整个连接对象的处理呢?
    public void ExecuteNonQuery(SqlCommand Cmd)
    {
        //========== Connection ==========//
        SqlConnection Conn = new SqlConnection(strConStr);

        try
        {
            //========== Open Connection ==========//
            Conn.Open();

            //========== Execute Command ==========//
            Cmd.Connection = Conn;
            Cmd.CommandTimeout = 180;
            Cmd.ExecuteNonQuery();
        }
        catch (Exception Exc)
        {
            throw Exc;
        }
        finally
        {
            //======== Closing Connection ========//
            if (Conn.State == ConnectionState.Open)
            { Conn.Close(); }

            //======== Disposing object ========//
            Conn = null;
        }
    }

3
以下是几点说明,解释一些答案的“为什么”... throw Exc 会替换异常的堆栈跟踪,使其难以调试。您可以仅写 throw ,或者完全省略 catch。Conn = null 实际上什么也没做,您可能正在寻找 Conn.Dispose()(它将处理关闭)。using() 块只是 try/finally/dispose 的简写 - 是缩短代码行数的好方法... - Rob Fonseca-Ensor
4个回答

6

首先,考虑使用 using,其次,让框架处理资源释放。基于连接字符串,托管提供程序 将进行连接池管理。

public void ExecuteNonQuery(SqlCommand Cmd) 
{ 
    //========== Connection ==========// 
    using(SqlConnection Conn = new SqlConnection(strConStr))
    { 
        //========== Open Connection ==========// 
        Conn.Open(); 

        //========== Execute Command ==========// 
        Cmd.Connection = Conn; 
        Cmd.CommandTimeout = 180; 
        Cmd.ExecuteNonQuery(); 
    } 
} 

4
  • 在 .NET 中,您不需要将任何内容设置为 null 或 nothing。这由垃圾回收自动处理。

  • 在错误处理和正常情况下都必须调用 Conn.Dispose()。Try Catch Finally 块非常适合此操作。另一种选择是在声明连接时使用 Using 关键字,以便无论发生什么,连接对象都将被正确处理。

  • 不要担心池化连接。如果每次需要使用连接时都打开一个新的连接,那么这是可以的。ADO.NET 会在后台为您池化连接。如果重复使用相同的打开连接对象,则会有轻微的性能问题,但为了保持简单,请不要担心它。

您也可以对以下代码执行相同的操作。结果将是相同的。无论是否出错,Conn 都将被正确处理。任何错误都将向上传递,与之前相同。

public void ExecuteNonQuery(SqlCommand Cmd)
{
    Using (SqlConnection Conn = new SqlConnection(strConStr));
    {
        //========== Open Connection ==========//
        Conn.Open();

        //========== Execute Command ==========//
        Cmd.Connection = Conn;
        Cmd.CommandTimeout = 180;
        Cmd.ExecuteNonQuery();
    }
}

正如您所见,如果您想/需要的唯一错误处理是确保正确处理连接对象,则使用Using语法可以使事情井井有条。


谢谢,你的帖子也很有帮助。我不确定我能否将多个回复标记为答案。 - user291660
你只能有一个“被采纳的答案”,如果要选择另一个,必须先取消之前的选择。如果你最终选择了其他答案,也没关系!当然,一旦你可以(我想你需要15个赞),你肯定会给那些尝试帮助你的人点赞。欢迎来到Stackoverflow。正如你所看到的,这是一个获得帮助的好地方! - Patrick Karcher

0

将它设置为 null 是多余的,因为在函数结束时它会自动超出范围。是的,如果这样做,您仍然使用连接池。


但是如果不“关闭”(放弃)连接,您可能会很快耗尽池中的连接。 - Rob Fonseca-Ensor

0
你可以处理你的对象,同时仍然使用池。
而且如果它符合以下条件
  1. 托管应用程序
  2. 是 Web 应用程序
  3. 具有大量流量
那么处理对象将为您提供很大的帮助,因为垃圾收集器通常无法跟上足以节省性能的速度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接