代码之家  ›  专栏  ›  技术社区  ›  Shachaf.Gortler

DbConnection创建命令性能影响

  •  0
  • Shachaf.Gortler  · 技术社区  · 8 年前

    我有一些使用工作流基础的遗留代码存在一些性能问题,我看到这种模式重复出现 db.CreateCommand() 有任何预成型击中,有没有其他方法来创建 DbCommand

    DbCommand CreateCommand(DbConnection db)
    {
      using (var cmd = db.CreateCommand())
      {
         ... 
         return cmd;
      }
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   D Stanley    8 年前

    还有其他方法创建DbCommand对象吗?

    不是以不确定提供商的方式。因为您使用的是摘要 DbConnection 1类而不是特定的提供程序,则需要使用工厂方法来确保使用正确的连接类型。

    请注意 一般来说 通常地 不是一个昂贵的过程。如果你想了解自己 真实的 如果您有性能问题 两种方法都试一下,然后测量差异 ,否则你(和我们)只是在猜测。

    我还要重申评论中提到的,你是 .不清楚你 使用命令而不仅仅是创建它,但返回一个已释放的对象可能会导致客户机尝试在错误状态下使用对象并获得错误。最好让客户处置它,而不是使用这种方法。

        2
  •  1
  •   marc_s    5 年前

    猜测 你会受到的性能打击 会很小 像这样的事情。 知道如何建立新的联系 一次又一次地 重复使用同一连接的成本非常高 但不要认为反复创建命令会产生与打开和关闭连接的成本与初始授权和建立连接的成本相同的效果。

    您可以尝试使用一个连接并重复使用此处接受的答案所解释的命令: Reusing SqlCommand?

    基本上显示了如下内容的更详细示例

    using(var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using(var command = new connection.CreateCommand())
        {
            command.CommandText = "--Some Awesome Sql Here";
            command.CommandType = CommandType.Text;
            command.Parameters.AddWithValue("@awesomeVariable",1337);
    
            /* Do Stuff until you need to make a new query / request */
    
            command.CommandText = "StoredProcedureGuy";
            //Get rid of old parameters
            command.Parameters.Clear();
    
            /* Rinse repeat */
        }
    }