NHibernate反射优化器 - 它做什么?

时间:2009-06-01 15:42:26

标签: .net nhibernate

我发现每当我禁用nhibernate反射优化器时,初始化我的会话工厂都会非常快。这非常适合测试目的。

<add key="hibernate.use_reflection_optimizer" value="false" />

我的问题是这样做的连锁效应是什么,为什么它不是默认设置? 似乎的所有内容都是一样的。

3 个答案:

答案 0 :(得分:11)

如果您想要的不仅仅是手册中反映优化器的单段提及的副本,那么对反射优化器的性能改进进行了很好的讨论here,以及对该反馈优化器的简要讨论。方法

从我有限的理解(这来自阅读,我没有实验,所以更正受到欢迎),缺点是实际上有两个反射优化器:

  1. codedom,基本上生成然后编译代码(即nhibernate为您的实体生成包装器Getter / Setter代码然后编译它)。从它的外观来看,这只适用于公共成员,并且可能额外使用昂贵,因为它天真地生成包装类(无论特定字段是否公开),尝试编译它并抛出如果失败则例外。

  2. lightweight code generation,它使用reflect.emit的神秘练习来获取/设置值。这对我来说仍然是一个非常新的领域,但对this的个人实验表明,您可以使用SRE非常快速地操纵私有变量,而source至少似乎为基本字段/属性提供了排放无视访问修饰符。这是默认设置。

  3. 关于连锁效应 - 好吧,从1中的闪亮图表来看,如果你在开发过程中坚持/保湿很多重物,它可能会非常重要。如果没有(并且我猜测你不是在测试/开发过程中)那么关闭它似乎是明智的。

答案 1 :(得分:7)

来自documentation

  

允许使用运行时生成的   用于设置或获取属性的类   实体或组件而不是使用   运行时反射(系统级   属性)。使用反射   优化器会造成某种启动   应用程序的成本,但应该   在长期内导致更好的表现   跑。您无法设置此属性   hibernate.cfg.xml或    部分   应用程序配置文件。

答案 2 :(得分:3)

来自https://www.hibernate.org/hib_docs/nhibernate/html/session-configuration.html

允许使用运行时生成的类来设置或获取实体或组件的属性,而不是使用运行时反射(系统级属性)。使用反射优化器会在应用程序上造成一定的启动成本,但从长远来看应该会带来更好的性能。您不能在hibernate.cfg.xml或应用程序配置文件的部分中设置此属性。