2010-11-09 8 views
0

Dans ce cas simple:NHibernate performances Paging (meilleure option)

public class Person 
{ 
    public int Id {get;set;} 
    public int Name {get;set;} 
} 
  • J'ai besoin de générer une grille avec la pagination et la commande
  • Ma base de données a environ 100k personnes

Qu'est-ce que l'option a de meilleures performances:

1) Obtenez tous elemtents la première fois et après prendre avantage de premier niveau NHibernate Cache, par exemple: de

personRep.FindAll().OrderBy(s =>s.Name).AsPagination(pageNumber,pageSize); 

obs AsPagination est une méthode d'extension ...

2) Get la page réelle de la base de données, par exemple:

public virtual IList<T> GetPaginedList(int __pageIndex, int __pageSize,out int __total) 
    {    
     var _rowCount = Session.CreateCriteria(typeof(T)) 
      .SetProjection(Projections.RowCount()).FutureValue<Int32>(); 

     var _results = Session.CreateCriteria(typeof(T)) 
      .SetFirstResult(__pageIndex * __pageSize) 
      .SetMaxResults(__pageSize) 
      .Future<T>(); 

     __total = _rowCount.Value; 
     return _results; 
    } 

Répondre

4

La deuxième option serait la meilleure solution.

Il est inutile de récupérer toutes les instances en une seule fois, lorsque vous (l'utilisateur) n'utilise peut-être même pas toutes ces instances. Si la classe 'Person' est une classe 'lourde' avec beaucoup d'associations, il serait encore mieux de créer une classe 'PersonView', qui ne contient que les propriétés que vous voulez afficher dans la Grille.

Vous n'avez pas besoin de mapper cette classe PersonView, vous devrez simplement 'l'importer', de sorte que NHibernate connaisse son existence. Ensuite, vous créez une requête sur la classe Person et définissez qu'un AliasToBean Transformer doit être utilisé pour convertir les instances Person en instances PersonView. Ainsi, NHibernate pourra générer une requête qui récupère uniquement les colonnes nécessaires à partir de la base de données et remplira PersonView instances avec celle-ci.

+0

Salut Frederik, Pourriez-vous me montrer comment "Importer" la vue et l'interroger?Merci – Paul

+1

Salut Paul, j'ai répondu à une question similaire ici, avec un exemple de code: http://stackoverflow.com/questions/747382/only-get-latest-results-using-nhibernate –

1

Comme de nombreuses questions de performance de récupération de données, ce qui est de ces mieux dépendra du scénario d'utilisation.

L'option 1 est préférable si l'utilisateur va probablement parcourir la plupart ou la totalité des pages avant que les données ne deviennent trop périmées pour être utiles. Il est également préférable dans le cas de jeux de résultats relativement petits (2 à 3 pages) et dans les cas où le jeu de résultats ne changera pas beaucoup (extraction d'autorisations d'utilisateur à partir d'une base de données). -term, en augmentant la performance des futures courses en éliminant le voyage aller-retour du réseau.

L'option 2 est meilleure pour les situations impliquant de longues pages de données et/ou des ensembles de résultats complets, des enregistrements "larges" ou des données qui changent assez souvent pour les mettre en cache localement. Il répartit le coût de récupération des enregistrements à travers l'utilisation de l'ensemble de résultats, dans la mesure nécessaire pour les montrer. Un tel «chargement paresseux» des résultats paginés augmente le temps et les frais généraux d'obtention des enregistrements (car il y a plus d'allers-retours), mais vos utilisateurs sont beaucoup plus susceptibles de remarquer et de se plaindre d'un délai de 10 secondes sur leurs résultats de recherche. d'une demi-seconde par page.