将 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 条推文,你就会遇到这个问题。
解决此问题的两种方法:
如果 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。
我正在尝试将 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 条推文,你就会遇到这个问题。
解决此问题的两种方法:
如果 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。