我正在尝试将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; }
}
}
答案 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条推文,你就会遇到这个问题。
解决此问题的两种方法:
如果TweetReceived稀疏(例如,它每分钟触发几次或更少),那么每次收到推文时都只需创建一个新的Raven会话。
如果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。