【问题标题】:Handle leak in C# ADO.Net Application [duplicate]处理 C# ADO.Net 应用程序中的泄漏 [重复]
【发布时间】:2018-11-16 23:06:43
【问题描述】:

这是一个使用 ADO.Net 执行查询的短代码 sn-p

using(SqlConnection objSqlConnection  = new SqlConnection(sConnectionString))
    {
    objSqlConnection.Open();

    using (SqlCommand objSqlCommand = new SqlCommand(sSQLQuery, objSqlConnection))
        {
        objSqlCommand.ExecuteNonQuery();
        }
    }

其中 'sConnectionString' 是标准 SQL Server 连接字符串,并且 'sSQLQuery' 是一个基本的 INSERT 查询

在循环(每秒一次)执行上述代码时,我发现了一些非常奇怪的东西。

应用程序的句柄计数在每次执行时不断增加。

我错过了什么吗?

任何想法将不胜感激。

这里还有其他类似的问题。答案之一是将目标框架更改为 3.5。但就我而言,这是不可能的——我的目标是 4.0。

【问题讨论】:

标签: c# ado.net sqlconnection sqlcommand executenonquery


【解决方案1】:

在@Freggar 和@Aphelion 的帮助下,我对连接字符串进行了一些更改 以下是我用来形成连接字符串的示例代码,

SqlConnectionStringBuilder objSqlConnectionStringBuilder = new SqlConnectionStringBuilder();
objSqlConnectionStringBuilder.DataSource                 = sMyDatabaseServer;
objSqlConnectionStringBuilder.IntegratedSecurity         = true;
objSqlConnectionStringBuilder.InitialCatalog             = sMyDatabaseName;
objSqlConnectionStringBuilder.ConnectTimeout             = 30;
objSqlConnectionStringBuilder.Pooling                    = false;


using(SqlConnection objSqlConnection  = new SqlConnection(objSqlConnectionStringBuilder.ConnectionString))
    {
    objSqlConnection.Open();

    using (SqlCommand objSqlCommand = new SqlCommand(sSQLQuery, objSqlConnection))
        {
        objSqlCommand.ExecuteNonQuery();
        }
    }

通过此更改显着减少了句柄泄漏,但不是完全

希望这可以帮助遇到同样情况的人

【讨论】:

  • 不要盲目关闭池,尤其是在为每个查询打开和关闭连接时。您也可以改为限制池大小(即:设置MaxPoolSize = 8;)。连接池允许您的应用程序重用以前关闭的连接,从而以保留这些资源为代价提高性能。见docs.microsoft.com/en-us/dotnet/framework/data/adonet/…
  • 谢谢,@C.Evenhuis 我也会试试这个选项
  • @C.Evenhuis,我已按照您的建议修改了代码,但没有按预期工作
  • 我不知道您的期望 - 我只是评论防止人们关闭池“因为 SQL 泄漏资源”,而不知道这些资源是有充分理由的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2015-06-15
  • 2012-07-01
  • 2012-09-16
相关资源
最近更新 更多