DBContext SaveChanges如何在内部工作?

问题描述:

在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

我不知道它是如何工作的内部好看不中用,但这种过载你更好的数据插入到队列中,并使用一个或多个(但有限)线程清空队列并写入数据库。您可以测试和调整线程数量,以免丢失数据。