【问题标题】:Do ConnectionPools have one connection, or many?ConnectionPools 有一个连接还是多个?
【发布时间】:2013-10-17 12:08:18
【问题描述】:

我们有一个使用单个连接字符串连接到数据库的 Web 服务器,这使其成为能够使用连接池的有力候选者。

我们需要一个 SqlConnection 对象还是多个?

我们应该在共享内存中建立一个连接,并且每次都使用它,还是应该在每次我们想要使用任何连接对象时创建一个新连接?

是调用 .Open() 从池中分配它,还是创建具有相同连接字符串的新对象?

另外,我们是否需要在连接释放回池之前调用 .Close(),还是变量超出范围足够?

我在某处读到(我忘了具体在哪里 - 抱歉)你不应该在池中的连接上调用 close,因为它会以某种方式将它们从池中删除。

【问题讨论】:

    标签: c# sql-server


    【解决方案1】:

    值得记住的是,相同的连接字符串将重用已返回池的连接,但以任何方式更改它都会导致与服务器建立新的连接。

    即 假设 SQLBox 的 IP 为 10.0.0.1

    using (var conn = new SqlConnection(@"Server=10.0.0.1;...") {
                    conn.Open();
                    .. Do work ..
                    conn.Close();
    }
    using (var conn = new SqlConnection(@"Server=SQLBox;…") {
                    conn.Open(); // This will *NOT* reuse the connection from the pool.
                    .. Do work ..
                    conn.Close();
    }
    using (var conn = new SqlConnection(@"Server=10.0.0.1;...") {
                    conn.Open(); // This *WILL* reuse the connection from the pool.
                    .. Do work ..
                    conn.Close();
    }
    

    【讨论】:

      【解决方案2】:

      您应该在每次需要访问数据库时打开一个单独的连接,并在完成所有访问后关闭它。不要让您的连接打开太久。没有必要,现代数据库肯定非常擅长处理多个连接。

      您可以将连接池的管理留给 SQL Server - 只要您不试图阻止它,它就会做得很好。

      最好使用本地连接对象,不要在代码的多个部分共享它。您可以使用using 模式来确保您的连接将被关闭:

      using (SqlConnection conn = new SqlConnection("connectionstring"))
      {
          conn.Open();
          // use your connection here
      }
      

      【讨论】:

      • 我明白最好使用“using”,但如果我有很多遗留代码没有,我需要担心,还是会退出范围(并且没有变量指向到它)关闭连接并将其返回到池中。
      • 你也可以使用Close(),你不必使用using
      • 不,当保存它们的变量超出范围时,连接不会关闭。我现在不是 100% 确定,但是如果持有连接的线程被杀死或完成,连接将被关闭。当然,停止打开连接的进程也会关闭连接。
      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 2010-10-05
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多