在RavenDB中使用SaveChangesAsync

时间:2012-06-19 09:56:04

标签: c# asynchronous insert nosql ravendb

我将大量数据插入RavenDB数据库;大约2 500 000条记录。这需要在尽可能短的时间内完成。

我使用一个列表来保存SaveChangesAsync返回的Task对象:

session.Store(loc);

splitter++;
if (splitter % 2048 == 0)
{
    var t = session.SaveChangesAsync();
    tasks.Add(t);

    if (tasks.Count == 2)
    {
        Task.WaitAll(tasks.ToArray());
        tasks.Clear();
    }
}

此代码在具有i7(8核)和12 GB RAM的机器上运行。如果我持有的Task对象的数量是2(如您在代码中看到的那样),但是如果我将此数字增加到8(核心数),则会收到System.IndexOutOfRangeException(有时会出现System.AggregateException: Raven.Abstractions.Exceptions.ConcurrencyException:PUT尝试在文档'X / I'上使用非当前的etag“)。

这里有什么问题?

由于

3 个答案:

答案 0 :(得分:5)

每个会话只能有一个异步挂起操作。

答案 1 :(得分:3)

此代码存在两个问题:

  • 您正在尝试保存更改,同时仍向会话添加更改。
  • 在第一个完成之前,您正在安排另一个SaveChangesAsync。这可能会引发ConcurrencyException

至少应该等待每个SaveChangesAsync调用完成,然后再安排另一个。

答案 2 :(得分:0)

您需要使用BulkInsert。它用于将大量数据保存到数据库中,因为异步对您没有帮助。