问题标签 [nhibernate-caches]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
302 浏览

nhibernate - 特定区域的休眠清除缓存

我正在尝试手动清除特定区域的 2 级缓存。我找到了在回答这个问题时发布的方法。虽然这正在清除我的实体,但由于某种原因,查询缓存没有被清除。这会在下次从数据库中检索实体时对每个实体进行单独的查询。当我在没有任何参数的情况下调用 sessionFactory.EvictQueries() 时,如果确实有效。仅当我传入特定区域名称时它才不起作用。关于出了什么问题的任何想法?

代码来自上面的链接:

缓存正在工作并使用 NHProfiler 进行验证。

0 投票
1 回答
76 浏览

nhibernate - NIBerate session.Get() 获取缓存的实体。如何从数据库中获取最新的实体?

我正在使用 CQRS 模式使用 NHibernate 从数据库中获取数据。

这是调用 UpdateProductHandler 的 CommittingTransactionCommandHandler

这是更新的命令处理程序。

这是 Get 的查询处理程序

这是 Product 实体的代码

流量是

CommittingTransactionCommandHandler是一个通用的命令处理程序。这是从 API 调用的,该 API 在内部调用UpdateProductHandler。事务在此打开并在此提交

情景是这样的

  1. 我使用GetProductHandler从数据库获取产品。(在这种情况下,产品的版本号为 10。)

  2. 我正在使用UpdateProductHandler更新产品并提交事务下的会话。(此处产品的版本号为 11)

  3. 在更新产品之后,我立即使用GetProductHandler查询同一个产品,并在 UI 的编辑模式下加载它。(但使用 GetProductHandler 获取的 Product 的版本号是 10 而不是 11。)

  4. 这是问题所在,上面的GetProductHandler不是从数据库获取最新更新,而是获取对象的先前状态。(使用版本号找到)

  5. 现在,如果我尝试更新产品,我会收到过时对象状态异常,因为版本号是 10,这不是产品的最新版本。

我已经尝试过 session.Refresh(product) 但都是徒劳的,因为它会影响其他交易。

我该如何解决这个问题?