优化nHibernate中的查询

本文关键字:查询 nHibernate 优化 | 更新日期: 2023-09-27 18:13:57

我使用以下代码创建一个报告(返回的对象列表用作rdlc文件中的数据源)。

我正在查询一个TNA对象列表,其中每个对象都可以包含一个Training对象列表。每个Training对象可以包含Course对象。每个TNA对象包含一个Employee对象。

然而,我发现代码需要很长时间才能运行。

此外,如果我们有超过几百个TNA对象,我们会在查询完成之前得到内存不足错误。

我没有很多nHibernate的经验-是否有可能优化这段代码或代码中有任何明显的错误?

提前感谢。

    DetachedCriteria dc = this.BuildPermissions(moduleUser, typeof(TNA));
    ICriteria criteria = dc.GetExecutableCriteria(this.Session);
    criteria.Add(Restrictions.Eq("Id", id));
    criteria.CreateAlias("TrainingRecords", "TrainingRecords", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
    criteria.Add(Restrictions.Not(Restrictions.Eq("TrainingRecords.TNAStatus", TNAStatus.Optional)));
    ProjectionList projectionList =
        Projections.ProjectionList()
                   .Add(Projections.Property("OrgUnit"), "OrgUnit")
                   .Add(Projections.Property("Employee"), "Employee")
                   .Add(Projections.Property("TrainingRecords.Course"), "Course")
                   .Add(Projections.Property("TrainingRecords.RequiredBy"), "RequiredBy")
                   .Add(Projections.Property("TNATemplate"), "TNATemplate")
                   .Add(Projections.Property("TrainingRecords.TNAStatus"), "TNAStatus")
                   .Add(Projections.Property("Customer"), "Customer");

    ICriteria result = criteria.SetProjection(projectionList)
                               .SetResultTransformer(Transformers.AliasToBean<TrainingMatrix>());
    return result.List<TrainingMatrix>();

优化nHibernate中的查询

首先,请在nhibernate配置中添加. showsql,并检查nhibernate生成的sql语句。你可以把它放在SQL管理工作室等,看看性能。

第二,您可以使用SQL profiler之类的工具来检查数据库中正在发生的事情。

第三,请确保在DB中创建了合适的键和索引

第四,检查如何初始化您的sessionfactory。您是否每次都创建新的sessionfactory

第五,看到你可以使用nhibernate的缓存

第六,检查如何从报表调用程序作为数据源。查找任何无限循环,一次又一次地重复绑定数据源等。

第七,如果不需要第二个表中的所有数据,而不是投影,您可以使用延迟加载并根据需要获取对象