如果我有關於2000 record
和我做一個多重插入。哪種方法比其他方法有更好的性能?在每個單一的非查詢或整個連接之前打開連接?
- 與每個插入單元連接,並在插入後關閉。
- 整個批量的一個連接並關閉 端的連接。在這種情況下連接超時情況如何?
注意:
數據庫是Informix的數據庫。
大約需要3.5到4分鐘,以插入約6000記錄。(與 第一種方法)
如果我有關於2000 record
和我做一個多重插入。哪種方法比其他方法有更好的性能?在每個單一的非查詢或整個連接之前打開連接?
注意:
數據庫是Informix的數據庫。
大約需要3.5到4分鐘,以插入約6000記錄。(與 第一種方法)
應用程序連接池將很大程度上使此問題變得無關緊要,因爲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連接,其他來源的內置連接提供程序也會以類似的方式運行。
連接的默認行爲是,它被添加到池。因此,當調用Close()
時,它並未真正關閉,而是剛剛釋放到池中,並且在新連接上調用Open()
時,會從池中選取現有的打開連接。
如果在完整插入過程中打開連接而禁用連接池,則優先於在每次插入後關閉連接。
我最近做了一個小修補與非常類似的情況。我有一個應用程序可以從1到任意數量的記錄插入到MySQL數據庫中。
爲了演示(對於您自己),Magnus在他的回答中描述的連接池行爲,您可以啓動一個快速應用程序。隨着一個按鈕,在點擊事件,打開(然後.close())一個到你的數據庫連接,然後單擊按鈕「重新打開」連接後幾次。 (請務必給自己一些反饋,所以你知道什麼時候。開()成功(如果))。你會發現在初始連接需要幾秒鐘,但是當連接從池中抓住隨後的嘗試是非常快的。
基於我的帶動想要的東西,我們最後通過動態生成一個大的INSERT語句,更多的是「全有或全無」的方法做一個「散裝」插入,而不是個別的INSERT語句。有一次,我有兩個版本的程序使用單獨的插入,也有批量插入的方法。 對於我們的情況,我真的沒有看到任何noticable性能差異。 (公平地說,有沒有大量的工作正在做任)
很適合我的第二個選項。每次你打算髮表聲明時,你都不需要打開和關閉。每個打開的連接都需要處理池的連接。使用相同的連接,你只能去池中詢問連接一次 – Jorge 2011-12-27 20:45:14