将 Twitter 示例流保存到 RavenDB 导致异常 The maximum number of requests allowed for this session has been reached

Saving a Twitter Sample Stream to RavenDB results in the exception The maximum number of requests (30) allowed for this session has been reached

我正在尝试将 Twitter 示例流保存到 RavenDB,但遇到异常:"The maximum number of requests (30) allowed for this session has been reached."

This 问题有同样的问题,但是我 认为 通过调用 session.Store 我已经在做接受的答案建议的事情。

我知道我做错了什么但不确定是什么。

这是我的代码:

using Tweetinvi;

namespace TwitterNoSql
{
    class Program
    {
        static void Main(string[] args)
        {
            Auth.SetUserCredentials() // redacted for SO

            var stream = Stream.CreateSampleStream();

            using (var session = DocumentStoreHolder.Store.OpenSession())
            {
                stream.TweetReceived += (sender, theTweet) =>
                {
                    var tm = new TwitterModels
                    {
                        Id = theTweet.Tweet.Id,
                        TheTextFromTwitter = theTweet.Tweet.FullText
                    };

                    session.Store(tm);
                    session.SaveChanges();

                };
                stream.StartStream();

            }                
        }                        
    }
}

DocumentStoreHolder.cs

using System;
using Raven.Client;
using Raven.Client.Document;

namespace TwitterNoSql
{
    class DocumentStoreHolder
    {
        private static readonly Lazy<IDocumentStore> LazyStore =
            new Lazy<IDocumentStore>(() =>
            {
                var store = new DocumentStore
                {
                    Url = "http://localhost:8080",
                    DefaultDatabase = "TwitterNoSql"
                };
                return store.Initialize();
            });

        public static IDocumentStore Store =>
             LazyStore.Value;
    }
}

TwitterModels.cs

namespace TwitterNoSql
{
    public class TwitterModels
    {
        public long Id { get; set; }
        public string TheTextFromTwitter { get; set; }
    }
}

尝试在操作结束时调用 SaveChanges():

using (var session = DocumentStoreHolder.Store.OpenSession())
{
    stream.TweetReceived += (sender, theTweet) =>
    {
        var tm = new TwitterModels
        {
            Id = theTweet.Tweet.Id,
            TheTextFromTwitter = theTweet.Tweet.FullText
        };

        session.Store(tm);

    };

    stream.StartStream();
    session.SaveChanges();  

}

假设这是一个非常大的数据集,您可能不想使用会话来完成它,批量插入在这里会更好。

您正在创建单个文档会话,并将其用于收到的所有 推文。所以,如果你在一个小时内收到 5000 条推文,你就会遇到这个问题。

解决此问题的两种方法:

  1. 如果 TweetReceived 稀疏(例如,它每分钟触发几次或更少),则每次收到推文时都创建一个新的 Raven 会话。

  2. 如果 TweetReceived 被快速连续触发多次(例如,几秒钟内收到 5000 条推文),则使用 Raven BulkInsert.

选项 #1,收到的每条推文的会话:

static void Main(string[] args)
{
    Auth.SetUserCredentials() // redacted for SO

    var stream = Stream.CreateSampleStream();
    stream.TweetReceived += (sender, theTweet) =>
    {
        var tm = new TwitterModels
        {
            Id = theTweet.Tweet.Id,
            TheTextFromTwitter = theTweet.Tweet.FullText
        };

        using (var session = DocumentStoreHolder.Store.OpenSession())
        { 
           session.Store(tm);
           session.SaveChanges();
        }
    };
    stream.StartStream();             
}       

选项 #2,使用批量插入:

using (BulkInsertOperation bulkInsert = store.BulkInsert())
{
   stream.TweetReceived += (sender, theTweet) =>
   {
       var tm = new TwitterModels
       {
           Id = theTweet.Tweet.Id,
           TheTextFromTwitter = theTweet.Tweet.FullText
       };


       bulkInsert.Store(tm);
   }
};

两者都可以在这里工作。如果推文在应用程序的生命周期内很少到达,请使用 #1。如果推文一次性全部到达,请使用#2。