Session ravendb长时间运行会话

Session ravendb长时间运行会话,session,structuremap,ravendb,Session,Structuremap,Ravendb,我们的网站使用RavenDB。该站点将其所有数据加载到内存中(不是很多),以便能够处理大量负载。我们在后台线程中加载数据,该线程定期检查DB(RavenDB+sqlserver)是否存在任何新数据,如果存在,则将该数据加载到内存中 我们已经尝试了很多方法来绕过每个会话30次查询RavenDB的恼人的请求限制。因为Raven没有任何机制在我们完成一次检查/加载循环后“重置”会话,而且因为没有办法告诉Structuremap我们真的想要一个新会话,即使我们还是和以前一样的线程,我们有点卡住了 最后,

我们的网站使用RavenDB。该站点将其所有数据加载到内存中(不是很多),以便能够处理大量负载。我们在后台线程中加载数据,该线程定期检查DB(RavenDB+sqlserver)是否存在任何新数据,如果存在,则将该数据加载到内存中

我们已经尝试了很多方法来绕过每个会话30次查询RavenDB的恼人的请求限制。因为Raven没有任何机制在我们完成一次检查/加载循环后“重置”会话,而且因为没有办法告诉Structuremap我们真的想要一个新会话,即使我们还是和以前一样的线程,我们有点卡住了

最后,我重新构建了存储库,以便我们的存储库现在使用structuremap为我们加载的RavenSessionProxy,它可以通过加载/获取循环重置(当我们重置它时,它会手动初始化一个新的documentsession)

这真的是唯一的办法吗?Raven内部是否有任何机制可以说“嗨,Session先生,我现在不想再跟你说话了,去冲洗一下你自己,下次我拜访你的时候保持新鲜和准备好)”或者告诉Structuremap“嗨,SM!下次我要你的IDocumentSession,给我一个新的,我厌倦了这个旧的”

AndreasKnudsen, RavenDB会话的设计寿命相对较短。如果你需要让他们呆一段时间,你可能做错了什么。 请注意,RavenDB已经做了很多工作来确保它的速度,因此不需要将内容加载到内存中


您可以设置session.Advanced.MaxNumberOfRequests,这将增加您可以执行的请求量,但也意味着您将在内存中保留更多内容。

正如Ayende指出的,会话应该是短期的。与其让后台作业依赖于会话,不如让它依赖于IDocumentStore,然后为每次运行创建/处置会话。IDocumentStore可以是启动时插入容器中的单例。

MaxNumberOfRequests只会推迟问题的出现,关键是我希望会话能够永远持续下去,只需定期重置自身。并非所有用例都是针对单个请求执行最多30个查询然后终止的。我的背景加载应该永远存在