为什么NHibernate自动冲洗支票如此昂贵?
实际上,我们发现默认的NHibernate(v2.0&2.1)FlushMode=Auto非常昂贵。查看NHibernate源代码表明,用于确定需要刷新哪些内容的算法依赖于在会话中通过所有实体的强力循环,这在事务中运行的每个查询中都会发生 在一些对许多项进行更新的生产场景中,通过多个查询,我们发现使用FlushMode=Auto的过程比使用FlushMode=Commit的过程长100倍 在执行涉及多个更新、多个查询等的“复杂”会话逻辑时使用FlushMode的任何想法/建议/最佳实践为什么NHibernate自动冲洗支票如此昂贵?,nhibernate,Nhibernate,实际上,我们发现默认的NHibernate(v2.0&2.1)FlushMode=Auto非常昂贵。查看NHibernate源代码表明,用于确定需要刷新哪些内容的算法依赖于在会话中通过所有实体的强力循环,这在事务中运行的每个查询中都会发生 在一些对许多项进行更新的生产场景中,通过多个查询,我们发现使用FlushMode=Auto的过程比使用FlushMode=Commit的过程长100倍 在执行涉及多个更新、多个查询等的“复杂”会话逻辑时使用FlushMode的任何想法/建议/最佳实践 关于优化
关于优化nHibernate中的自动刷新算法有什么想法吗?这种缓慢是一个已知的问题,NH as对此进行了跟踪 NH中有三种冲洗模式:
- FlushMode.Auto=需要时刷新(如果需要,在提交时和查询之前)。这是默认设置
- FlushMode.Commit=仅在提交NH事务时刷新
- FlushMode.Never=从不刷新(直到调用flush)。这将在插入使用本机(标识)PK生成器的实体时发生
刷新模式。始终:在执行任何查询之前刷新会话,代价高昂。还有FlushMode.Unspecified
,它是一个特殊的空值;不确定它是否真的可以使用。