DbConnection create 命令性能影响

DbConnection create command performance implications

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

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

猜测对于这样的事情,您对性能的影响会非常小知道一遍又一遍地创建新连接可能比重新使用相同的连接成本非常高,但不要认为一遍又一遍地创建命令会具有与打开和关闭连接的成本相同的效果与初始授权和建立连接有关。

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

is there any other way to create a DbCommand object ?

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

请注意,通常 连接由 .NET 汇集,因此创建 通常 并不是一个昂贵的过程。如果你想知道你的实际情况是否有性能问题,那么尝试两种方法并衡量差异,否则你(和我们)只是在猜测。

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