我发现每当我禁用nhibernate反射优化器时,初始化我的会话工厂都会非常快。这非常适合测试目的。
<add key="hibernate.use_reflection_optimizer" value="false" />
我的问题是这样做的连锁效应是什么,为什么它不是默认设置? 似乎的所有内容都是一样的。
答案 0 :(得分:11)
如果您想要的不仅仅是手册中反映优化器的单段提及的副本,那么对反射优化器的性能改进进行了很好的讨论here,以及对该反馈优化器的简要讨论。方法
从我有限的理解(这来自阅读,我没有实验,所以更正受到欢迎),缺点是实际上有两个反射优化器:
codedom,基本上生成然后编译代码(即nhibernate为您的实体生成包装器Getter / Setter代码然后编译它)。从它的外观来看,这只适用于公共成员,并且可能额外使用昂贵,因为它天真地生成包装类(无论特定字段是否公开),尝试编译它并抛出如果失败则例外。
lightweight code generation,它使用reflect.emit的神秘练习来获取/设置值。这对我来说仍然是一个非常新的领域,但对this的个人实验表明,您可以使用SRE非常快速地操纵私有变量,而source至少似乎为基本字段/属性提供了排放无视访问修饰符。这是默认设置。
关于连锁效应 - 好吧,从1中的闪亮图表来看,如果你在开发过程中坚持/保湿很多重物,它可能会非常重要。如果没有(并且我猜测你不是在测试/开发过程中)那么关闭它似乎是明智的。
答案 1 :(得分:7)
允许使用运行时生成的 用于设置或获取属性的类 实体或组件而不是使用 运行时反射(系统级 属性)。使用反射 优化器会造成某种启动 应用程序的成本,但应该 在长期内导致更好的表现 跑。您无法设置此属性 hibernate.cfg.xml或 部分 应用程序配置文件。
答案 2 :(得分:3)
来自https://www.hibernate.org/hib_docs/nhibernate/html/session-configuration.html
允许使用运行时生成的类来设置或获取实体或组件的属性,而不是使用运行时反射(系统级属性)。使用反射优化器会在应用程序上造成一定的启动成本,但从长远来看应该会带来更好的性能。您不能在hibernate.cfg.xml或应用程序配置文件的部分中设置此属性。