2012-07-09 93 views
3

在SQL Server 2008中使用實體框架,我們有一個應用程序可以寫入大量數據,比如每分鐘有1000個新行,每個行都在他們自己的DBContext.saveChanges調用中(我們沒有將它們分配到一起)DBContext SaveChanges如何在內部工作?

問題在於我們的寫作落後了。這似乎是事情顛簸。例如,我們將在兩分鐘內用新行調用saveChanges幾千次,而不會進行單個寫操作,然後突然之間我們會得到一些寫操作(但很多都是完全丟失的)。

我們已經採用了一個SQL跟蹤,並且發現即使我們的saveChanges調用中有10%都沒有寫入SQL命令。

因此,saveChanges和SQL Server之間似乎存在問題。我想知道這個電話是如何工作的。它使用線程池嗎?排隊?一些緩衝區,我們可能會超出?也許由於寫入數量而導致其默默無聞?

MSDN上解釋這個東西實際上是如何工作的

+0

當有很多待處理的更改(1000s)時,我發現在SaveChanges()中花費的大部分時間都是數據驗證(DataAnnotations)。 – jrummell 2012-07-09 14:33:00

+0

你使用1個DbContext還是爲每一行創建一個新的DbContext? – Wim 2012-07-09 14:35:30

+0

@Wim對每一行都是新的,我們做一個使用(var context = new DataEntities()){do the write ..} – Erix 2012-07-09 14:39:23

回答

0

我不知道它是如何工作的內部好看不中用,但這種過載你更好的數據插入到隊列中,並使用一個或多個(但有限)線程清空隊列並寫入數據庫。您可以測試和調整線程數量,以免丟失數據。