2016-07-14 49 views
0

我有一些遗留代码使用工作流基础,有一些性能问题,我看到这种模式重复。 db.CreateCommand()是否有任何预成形命中,是否有任何其他方式来创建一个DbCommand对象?DbConnection创建命令性能影响

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

有趣的方法,通过,方式,它返回一个命令,但首先处置它。那么客户应该如何处理返回的值呢? –

+1

@WiktorZychla提到的是,事实上,您的“使用”代码在实际返回对象之前先处理对象。我猜这只是psuedocode,因为如果它是真实的代码,这将是有问题的 –

回答

1

一个更详细的例子还有没有其他的如何创建一个DbCommand对象?

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

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

我也会重申在评论中提到的是,你是返回一个处置对象。目前还不清楚做了什么而不是仅仅创建它,但是返回一个处理对象可能会导致客户端尝试使用处于不良状态的对象并获取错误。最好让客户处理它而不是这种方法。

1

猜测的表现打你会采取会是这样的事情非常小知道创建新的连接反复可以是重复使用相同的连接成本很高但是不要认为创建反复命令会产生同样的效果,因为打开和关闭连接的成本与初始授权和建立连接。

您可以尝试使用一个连接和重用命令由公认的答案在这里解释: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 = "StoreProcGuy"; 
     //Get rid of old parameters 
     command.Parameters.Clear(); 

     /* Rinse repeat */ 
    } 
} 
+0

连接汇集,并且通常在大多数情况下不会打开并重新打开。所以很少有关闭和开放连接到同一个源的性能损失。 –

+0

@ErikFunkenbusch意味着打开新的连接,就像在这个例子中创建并处理新的DbCommand一样,将阐明 – konkked