将Twitter示例流保存到RavenDB导致异常已达到此会话允许的最大请求数(30)

时间:2017-06-05 20:47:22

标签: c# ravendb

我正在尝试将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; }
    }
}

3 个答案:

答案 0 :(得分:3)

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

}

答案 1 :(得分:2)

假设这是一个非常大的数据集,您可能不希望使用会话来执行此操作,批量插入在这里可以更好地工作。

答案 2 :(得分:2)

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

解决此问题的两种方法:

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

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

  3. 选项#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。