【问题标题】: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
【发布时间】:2017-11-06 17:27:55
【问题描述】:

我正在尝试将 Twitter 示例流保存到 RavenDB,但遇到异常:“已达到此会话允许的最大请求数 (30)。”

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; }
    }
}

【问题讨论】:

    标签: c# ravendb


    【解决方案1】:

    尝试在操作结束时调用 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();  
    
    }
    

    【讨论】:

      【解决方案2】:

      假设这是一组非常大的数据,您可能不想使用会话来执行此操作,这里使用批量插入会更好。

      【讨论】:

        【解决方案3】:

        您正在创建单个文档会话,并将其用于接收到的所有条推文。因此,如果您在一小时内收到 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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-05
          • 1970-01-01
          • 2020-03-13
          • 2022-12-01
          • 2012-09-19
          • 1970-01-01
          • 2018-03-19
          相关资源
          最近更新 更多