代码之家  ›  专栏  ›  技术社区  ›  Philippe Leybaert

SQL Server连接池未检测到关闭的连接?

  •  18
  • Philippe Leybaert  · 技术社区  · 14 年前

    多年来,我在所有连接到SQL服务器的Web应用程序上都遇到了非常奇怪的问题。

    问题是,如果数据库服务器发生问题(服务器重新启动或其他问题),de web应用程序将从该点停止工作,即使数据库服务器仍在运行,并且随后运行良好。

    发生的情况是,每个ADO.NET操作(executeNonQuery、createReader、beginTransaction,…)都会因 无效操作异常 : 无效操作。连接已关闭 “。好像是打电话给 sqlconnection.open()打开 从应用程序池中检索连接,该连接是…关闭!

    根据文档,连接池应自动从连接池中删除断开的连接,但显然,关闭的连接不被视为“断开”,因此调用 sqlconnection.open()打开 很高兴地返回一个关闭的连接,假设它是打开的,而不检查这个。

    我目前的解决方法是在打开连接后立即检查连接状态:

    using (SqlConnection connection = new SqlConnection( connectionString ))
    {
       connection.Open();
    
       if (connection.State != ConnectionState.Open)
       {
          SqlConnection.ClearAllPools();
    
          connection.Open();
       }
    
       // ...
    }
    

    这个变通方法现在似乎有效,但我不太愿意这样做。

    所以我的问题是:

    1. 为什么 sqlconnection.open()打开 是否从连接池返回已关闭的连接?
    2. 我的工作区有效吗?
    3. 有更好的方法来处理这个吗?
    2 回复  |  直到 14 年前
        1
  •  12
  •   AdaTheDev    14 年前


    Sql Server Google Group
    Using Connection Pooling in ASP.NET


    This

    剩余连接数大于 小于最小连接数 为池配置(默认 是0)。注意连接必须 已被应用程序关闭 (然后放回泳池)之前 它可以自动调节 释放。如果不关闭 代码连接或孤立 连接对象,池 机制不起作用。不,那里 不是的connectionString参数 更改超时值。

        2
  •  2
  •   Ruddy    14 年前

    我们使用ADO从C++中看到了同样的问题。几年前,在与Microsoft支持部门合作之后,我们还在代码中实现了类似的重试逻辑,并重置了解决问题的连接池。

    如果有更好的解决方案,微软技术支持人员要么不知道,要么不共享(无论如何)。