【问题标题】:DbConnection create command performance implicationsDbConnection 创建命令性能影响
【发布时间】:2016-11-18 00:38:09
【问题描述】:

我有一些使用工作流基础的遗留代码存在一些性能问题,我看到这种模式重复出现。 db.CreateCommand() 是否有任何 preformace 命中,还有其他方法可以创建 DbCommand 对象吗?

DbCommand CreateCommand(DbConnection db)
{
  using (var cmd = db.CreateCommand())
  {
     ... 
     return cmd;
  }
}

【问题讨论】:

  • 有趣的方法,顺便说一下,它返回一个命令,但首先处理它。那么客户端应该如何处理返回的值呢?
  • @WiktorZychla 指的是这样一个事实,即您的“使用”代码在对象实际返回之前将其处置。我猜这只是伪代码,因为如果它是真正的代码,那将是有问题的

标签: c# workflow-foundation-4 dbconnection


【解决方案1】:

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

不是以与提供者无关的方式。由于您使用的是抽象的DbConnection1 类而不是特定的提供者,因此您需要使用工厂方法来确保使用正确的连接类型。

请注意,一般连接是由 .NET 汇集的,因此创建一般并不是一个昂贵的过程。如果您想了解自己的实际情况是否存在性能问题,那么尝试两种方式并衡量差异,否则您(和我们)只是推测。

我还要重申 cmets 中提到的内容,即您返回一个已处置的对象。除了创建它之外,您还不清楚您使用该命令做什么,但返回已处置的对象可能会导致客户端尝试使用处于不良状态的对象并出现错误。最好让客户处理掉,而不是这种方法。

【讨论】:

    【解决方案2】:

    猜想你会受到的性能影响对于这样的事情会非常小知道一遍又一遍地创建新连接可能会重复使用相同的连接代价高昂,但不要认为一遍又一遍地创建命令会产生与打开和关闭连接的成本与初始授权和建立连接有关。

    您可以尝试使用一个连接并重用命令,如此处接受的答案所述: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 */
        }
    }
    

    【讨论】:

    • 连接是池化的,在大多数情况下通常不会被打开和重新打开。因此,关闭和打开到同一源的连接很少会降低性能。
    • @ErikFunkenbusch 的意思是打开新的连接,就像在这个例子中创建和处理新的 DbCommands 一样,将澄清
    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2016-05-17
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多