2011-12-27 33 views
1

如果我有關於2000 record和我做一個多重插入。哪種方法比其他方法有更好的性能?在每個單一的非查詢或整個連接之前打開連接?

  • 與每個插入單元連接,並在插入後關閉。
  • 整個批量的一個連接並關閉 端的連接。在這種情況下連接超時情況如何?

注意

  • 數據庫是Informix的數據庫。

  • 大約需要3.5到4分鐘,以插入約6000記錄。(與 第一種方法)

+1

很適合我的第二個選項。每次你打算髮表聲明時,你都不需要打開和關閉。每個打開的連接都需要處理池的連接。使用相同的連接,你只能去池中詢問連接一次 – Jorge 2011-12-27 20:45:14

回答

1

應用程序連接池將很大程度上使此問題變得無關緊要,因爲c#應用程序池已針對多個對同一數據庫的調用進行了優化。

這就是說,我做什麼遵循以下規則:

如果你可以打開一個連接,然後通過使用「使用」的語法做多的操作:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 
    // Do work here; connection closed on following line. 
} 

然後保持連接打開並進行所有操作。

但是,如果每個記錄都被操縱,然後以這種方式保存,您必須在每個點打開一個新的連接,不要擔心過多。您仍然可以在連接池方面表現出色。

從MSDN:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx

要部署高性能的應用程序,您必須使用連接池。當您使用SQL Server的.NET Framework數據提供程序時,您不必啓用連接池,因爲提供程序會自動管理它,儘管您可以修改某些設置。有關更多信息,請參閱SQL Server連接池(ADO.NET)。

即使您的連接不是SQL連接,其他來源的內置連接提供程序也會以類似的方式運行。

1

連接的默認行爲是,它被添加到池。因此,當調用Close()時,它並未真正關閉,而是剛剛釋放到池中,並且在新連接上調用Open()時,會從池中選取現有的打開連接。
如果在完整插入過程中打開連接而禁用連接池,則優先於在每次插入後關閉連接。

2

我最近做了一個小修補與非常類似的情況。我有一個應用程序可以從1到任意數量的記錄插入到MySQL數據庫中。

爲了演示(對於您自己),Magnus在他的回答中描述的連接池行爲,您可以啓動一個快速應用程序。隨着一個按鈕,在點擊事件,打開(然後.close())一個到你的數據庫連接,然後單擊按鈕「重新打開」連接後幾次。 (請務必給自己一些反饋,所以你知道什麼時候。開()成功(如果))。你會發現在初始連接需要幾秒鐘,但是當連接從池中抓住隨後的嘗試是非常快的。

基於我的帶動想要的東西,我們最後通過動態生成一個大的INSERT語句,更多的是「全有或全無」的方法做一個「散裝」插入,而不是個別的INSERT語句。有一次,我有兩個版本的程序使用單獨的插入,也有批量插入的方法。 對於我們的情況,我真的沒有看到任何noticable性能差異。 (公平地說,有沒有大量的工作正在做任)

相關問題