【问题标题】:SQL Connection Time out issueSQL 连接超时问题
【发布时间】:2018-10-12 11:00:35
【问题描述】:

我有一个包含连接 sql server 的类的 web 应用程序。我已经编写了如下所示的连接类

public SqlConnection DbConnectSql()
{
    string str = System.Configuration.ConfigurationManager.ConnectionStrings["conStr"].ToString();
    _con = new SqlConnection(str);
    if (_con.State == ConnectionState.Open)
        _con.Close();
    _con.Open();
   return _con;
}

当我在生产服务器上使用上述代码时,有时连接没有打开。重新启动 IIS 后连接工作正常。我必须每两天重新启动一次 IIS。工作 sql 连接。我们没有得到这个问题的确切例外。

要解决这个问题,我们是否需要关闭除“_con.State == ConnectionState.Closed”之外的所有其他情况的连接?如果我们这样做,这段代码是否有任何后续影响?

【问题讨论】:

  • 我很困惑为什么一个新的连接会被认为是打开的。也许有些问题是你做了一个新的 _con 覆盖旧的而不关闭它。

标签: c# asp.net sql-server iis


【解决方案1】:

修改

 if (_con.State == ConnectionState.Open)
            _con.Close();
        _con.Open();

 if (_con.State == ConnectionState.Closed)
                _con.Open();

然后尝试。

通常,在启动连接时检查连接是否打开,然后立即关闭并立即重新打开它,因为可能存在延迟问题,这不是一个好习惯。

检查是否有任何与该会话打开的连接(connection == Connection.Closed)然后,如果它已关闭,则打开它,否则什么都不做,因为我已经连接了。

这样,除了逻辑上更有意义之外,也更简洁。

另外,在您的代码中,当您使用 SqlConnection 时,将它们包装在一个

using(_con)
{
    //code here, sql stuff
};

语句,因为它会自行管理所有关闭和处理连接的内容,因此您可以确定当您的 sql 逻辑完成后,所有内容都会正确处理,而无需手动调用 Close 和 Dispose 方法。

让我知道它是否有效。

【讨论】:

    【解决方案2】:

    我们是否需要关闭所有其他情况的连接

    当然,因为所有连接都是在单个池中创建的。见https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

    • 尽量减少连接创建(或重复使用现有连接)
    • 使用完毕后,拨打con.Close(),然后拨打con.Dispose(),确保您的资源免费

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2011-09-04
      • 2019-12-30
      相关资源
      最近更新 更多