【问题标题】:ravendb long-running sessionsravendb 长时间运行的会话
【发布时间】:2012-04-03 05:51:43
【问题描述】:

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

我们已经尝试了很多方法来解决每个会话对 RavenDB 的 30 个查询的烦人请求限制。由于 Raven 没有任何机制在我们完成一次检查/加载循环的迭代后“重置”会话,并且由于无法告诉 Structuremap 我们真的想要一个新会话即使我们仍然是同一个线程,但我们有点卡住了。

最后,我重新架构了我们的存储库,现在我们的存储库使用 RavenSessionProxy,它为我们加载结构映射,可以通过加载/获取循环重置,(当我们重置它时手动实例化一个新的文档会话)。

这真的是唯一的方法吗? Raven 内部没有任何机制可以说“嘿,Session 先生,我现在已经完成了你的工作,你自己去冲洗一下,下次我打电话给你时保持新鲜并准备好)”或告诉 Structuremap “嘿,SM!下一个有时间我向你要一个 IDocumentSession,给我一个新的,我厌倦了这个旧的”

【问题讨论】:

    标签: session structuremap ravendb


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      安德烈亚斯克努森, RavenDB 会话被设计为相对较短的寿命。如果您需要将它们保留一段时间,那么您可能做错了什么。 请注意,RavenDB 已经做了很多工作来确保它的速度,因此不需要将内容加载到内存中。

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

      【讨论】:

      • MaxNumberOfRequests 只会推迟问题,关键是我希望会话永远持续下去,只是定期自我重置。并非所有用例都适用于最多执行 30 个查询然后死亡的单个请求。我的后台加载是应该永远存在
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      相关资源
      最近更新 更多