2016-07-14 117 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