nhibernate - NHibernate 短路延迟加载从缓存中拉取
问题描述
我有一些遗留代码可以对大量“静态”记录进行大量延迟加载,并在 NHibernate Profiler 中产生大量 N+1 警报,我正在尝试修复这些警报。我发现通过配置二级缓存,它修复了许多 N+1,但由于实体被它们的 ID以外的东西访问,许多实体仍然存在,即子实体上的外键值引用其父实体而不是子实体的主键。我的理解是,只有在实体通过 ID 访问时才使用二级缓存。我试图消除尽可能多的 N+1 问题,同时尽可能减少遗留代码中的代码更改。
有没有办法在 NHibernate 中缩短延迟加载,以便在调用 NHibernate 的延迟加载代码来执行数据库查询之前执行自定义代码?像下面这样的东西?
public class Customer
{
public virtual IList<SomeStaticData> Foo
{
get
{
return CachedStuff.GetStaticData() ?? InvokeNHibernateLazyLoad();
}
set;
}
解决方案
我认为最好在这里查看这个答案,https: //stackoverflow.com/a/27164913/13945347 然后查看 Ayende Rahien 的这篇文章,以更好地了解 N+1 问题的真正含义,https://ayende.com/blog/3732/solving-the-select-n-1-problem。
我认为解决您的问题的最佳方法不是按照您建议的方式处理它。您不应该使 LazyLoad 短路,并且应该考虑到这一点来设计您的应用程序和模型。明确定义哪些模型应该被急切地获取,哪些应该被延迟加载。
推荐阅读
- flutter - 有条件地使用 useFuture
- ruby-on-rails - 我的“不允许的参数::passenger”Rails 错误来自哪里?
- html - 使用 HTML lib 在 Flutter 中解析 html
- pgadmin-4 - pgAdmin 编辑结果表中的数据
- java - 如何在最后输入字母几秒钟后显示 AutoCompleteTextView 的下拉列表?
- javascript - 在我的代码中找不到错误,可能与我如何管理 Branch 类有关
- python - 装饰器可以用来模拟试验吗?
- mysql - 我想编写一个 SQL 查询来确定员工人数最多的公司,然后显示它是以前公司的员工
- c# - 程序运行期间的 ASP.NET Switch 数据库
- javascript - 对象没有被推入上下文 api 中的数组中