【问题标题】:Get a rid of SqlConnection, which remains in Activity Monitor after being closed/disposed摆脱 SqlConnection,它在关闭/处置后仍保留在 Activity Monitor 中
【发布时间】:2016-11-24 16:42:12
【问题描述】:

我正在使用 ADO.NET 创建数据库。基本上,我是用下一种方式执行 SQL 命令:

private bool ExecuteSqlCommand(string command)
{
    var success = true;

    using (var connection = GetSqlConnection())
    {
        if (connection == null)
             return false;

        using (var myCommand = new SqlCommand("query", connection))
        {
            try
            {
                connection.Open();
                myCommand.CommandText = command;
                myCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                success = false;
                Log.LogMessage(string.Format("Unable to execute SQL command: {0}", ex.Message));
            }
        }
    }

    return success;
}

GetSqlConnection 只是得到一些适当的 SqlConnection 连接字符串,如

"Server={0}\\{1};User Id={2};Password={3};Application Name={4};"

它运行良好,并且可以正确执行命令,但有一个例外 - 根据 Sql Manager Studio 活动监视器,即使在执行方法后它仍保持活动连接。

根据问题Why does my SqlConnection remain in the SSMS Processes list after closing it?,这是正确的行为,因为连接可能会被重用。但严重的问题是,稍后将为此数据库调用READ_COMMITTED_SNAPSHOT 命令,同时使用不同的SqlConnection。这会导致异常,因为READ_COMMITTED_SNAPSHOT 要求,用于调用此命令的连接应该是与数据库的唯一连接。

我不能重用这个连接来进一步操作数据库,因为我为它们使用了不同的连接字符串,数据库指定为 InitialCatalog(显然,我不能使用它,而数据库不存在)。

那么,我可以以某种方式删除这个初始连接吗?

【问题讨论】:

  • 试试这个:SqlConnection.ClearPool
  • @Rafal,为什么?为什么你需要为此触摸连接轮询。我认为这与 C# 无关……而是可能在 DB 端管理连接。
  • 这就是连接池的工作原理,它将连接到数据库的连接存储为在处理后打开以最小化打开关闭过程。
  • 好吧,ClearPool 似乎对我有用。一旦在命令执行后被调用,它就不再保留在活动监视器中。

标签: c# sql-server


【解决方案1】:

执行SqlConnection.ClearPool这将标记所有连接被丢弃而不是回收。

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 2010-10-12
    • 2015-07-18
    • 2018-02-05
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多