2014-07-22 4 views
0

J'utilise le code suivant pour créer un rapport (la liste des objets renvoyés est utilisée comme source de données dans un fichier rdlc).Optimisation des requêtes dans nHibernate

J'interroge une liste d'objets TNA, chacun pouvant contenir une liste d'objets Training. Chaque objet Training peut contenir un objet Course. Chaque objet TNA contient un objet Employee.

Cependant, je trouve que le code prend beaucoup de temps à s'exécuter.

En outre, si nous avons plus de quelques centaines d'objets TNA, nous obtenons une erreur de mémoire insuffisante avant la fin de la requête.

Je n'ai pas beaucoup d'expérience avec nHibernate - est-il possible d'optimiser ce code ou y a-t-il des erreurs évidentes dans le code?

Merci d'avance.

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>(); 

Répondre

0

En premier lieu, ajouter .ShowSql S'il vous plaît dans la configuration NHibernate et d'examiner la déclaration sql produite par NHibernate. Vous pouvez le mettre dans le SQL Managment Studio etc et voir les performances. Deuxièmement, vous pouvez utiliser des outils comme le profileur SQL pour examiner ce qui se passe dans la base de données.

troisième, s'il vous plaît assurez-vous que vous avez les clés appropriées et les index créés dans DB

quatrième, vérifiez comment vous initialisez la SessionFactory. Créez-vous de nouveaux sessionfactory à chaque fois?

cinquième, vous pouvez utiliser la mise en cache de nhibernate. Sixièmement, examinez comment vous appelez le programme du rapport en tant que source de données. rechercher toutes les boucles infinies, source de données liant à plusieurs reprises encore et encore, etc.

septième, si ne pas besoin de toutes les données de la deuxième table à la fois, au lieu des projections que vous pouvez utiliser le chargement paresseux et obtenir les objets sur une base besoin

+0

Malheureusement, j'ai traversé la plupart de ces étapes, et j'ai besoin de toutes les données à la fois. Le problème semble être le nombre d'objets renvoyés - plusieurs milliers - qui semblent provoquer une erreur de mémoire insuffisante. – Matt