performance - 如何减少 NHibernate 的属性代理开销?

标签 performance nhibernate fluent-nhibernate proxy castle-dynamicproxy

我们使用 Fluent NHibernate 1.3.0.727 和 NHibernate 3.3.0.4000 将属性映射到数据库中的列。以下是我们的 ClassMap 之一的缩写示例:

    public class TankMap : ClassMap<Tank>
    {
        public TankMap()
        {
            Id(o => o.Id);
            Map(o => o.TankSystem);
        }
    }

在本例中,TankSystem 属性是一个字符串

在我们的应用程序的某些部分中,有大量的计算涉及多次访问映射的属性(例如 TankSystem)。当我们分析应用程序时,仅仅访问这些属性就会花费相当多的时间,因为每次访问它们时,都必须通过 NHibernate.Proxy.DefaultLazyInitializer.Intercept 方法。

我们需要尽可能快地进行计算,并希望避免这种代理开销。一种方法是将我们想要的属性(例如 TankSystem)复制到数组中,并在任何时候我们想要访问此信息时使用数组,但这不是一种非常面向对象的方法。

更新:

我们尝试使用 Not.LazyLoad 映射我们的属性,例如:

Map(o => o.TankSystem).Not.LazyLoad();

但是,这似乎对该属性是否实际被代理没有任何影响。

是否有任何类型的选项可以避免/减少这种代理开销?

最佳答案

是的! .Not.LazyLoad() 来救援!

    public TankMap()
    {
        Id(o => o.Id);
        Map(o => o.TankSystem).Not.LazyLoad();
    }

我找到了一个很好且简短的解释:

You might wonder what the Not.LazyLoad() means. By default Fluent NHibernate defines the mappings to use lazy load. But that also means that all properties of our entities would have to be virtual(Proxies).

source

关于performance - 如何减少 NHibernate 的属性代理开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419062/

相关文章:

ruby-on-rails - 在 New Relic 上,什么有助于 Heroku Rails 应用程序的 "Time spent in Ruby"?

javascript - 正则表达式从 URL 中提取匹配的字符串(工作,更好的解决方案?)

nhibernate - 'index'和 'list-index'有什么区别

nhibernate - 将 Hibernate 过滤器属性应用于具有多对多关系的 Bag

c# - Fluent NHibernate 自动映射基类覆盖

c# - Fluent Nhibernate 与 MySQL 的连接字符串

php - 从 PHP 数组中获取最小值和最大值

MySQL:连接与按位运算符及其性能

c# - 流利的 NHibernate : How can i use Int64 as ID?

c# - 具有覆盖 : Map an unmapped base class collection 的 Fluent Nhibernate Automapping