|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Bonjour à tous
Le context : je voudrais créer un DLL spécialiser dans l'accés aux données d'une DB Oracle : DBConnectionManager :
DataAccessLayer :
Pour chacune des classes j'ai un projet test (NUnit) et c'est MEGA LENT quand je fais appel a une donnée... ma question est : qqu'un a t'il une idée du pourquoi ? Si vous voyez qque chose de pas logique dans l'architecture ou que je peux mieux faire n'hésitez pas à faire des remarques. Je ne suis pas vraiment à l'aise. Diplomegalo |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Nathanael MarchandExpert .Net So@t Inscription : octobre 2008 Messages : 3 521 ![]() |
Y'a des milliers de raisons pour lesquelles NHibernate peut être lent... Sans le code qui est lent, c'est dur de deviner
__________________
Retrouvez moi sur : |
|
20
|
|
|
#3 | ||||||||||
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Bonjour
Ok j'avais tellement de doutes que je pensais que le problème aurait pour origine l'architecture. Etape 2 : le code. Un tout grand merci pour votre aide et bonne journée. DBConnectionManager : Connection + gestion de session Code C# :
Entité Code C# :
Mapping Code C# :
DataAccessLayer Repository Code C# :
Test Code C# :
Un tout grand merci pour votre aide et bonne journée. |
||||||||||
|
|
00
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Je viens de débuger mon code. C'est le Get qui prend vraiment beaucoup de temps (plus de 10 sec).
Si vous avez des remarques, elles sont les bienvenues ++ |
|
|
00
|
|
|
#5 | ||
|
Membre chevronné
![]() Etienne MermillodInscription : février 2007 Messages : 442 ![]() |
Salut,
Tout d'abord je n'utilise pas Fluent, donc il possible/probable que je dise n'importe quoi... Une question, dans ton code: Code :
Code :
if (FluentConfiguration._sessionFactory == null){ Car parmi les choses couteuses en nhibernate il y a le buildSessionFactory... Bonne chance. |
||
|
|
00
|
|
|
#6 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Bonjour à tous
Tout d'abord merci pour votre aide et vos réponses. En ce qui concerne la création du ISessionFactory, en effet ce test renvoie une seul fois false. J'ai pu lire dans certains articles que le ISessionFactory était très lourd lors de la création et que le ISession était utilisé comme UOW. J'articule donc mon développement autour de ces concepts. J'ai effectué plusieurs tests à la suite l'un de l'autre et je n'économise pas vraiment de temps. Cependant je viens de faire une découverte : lorsque j'utilise l'ICriteria pour cibler mon information dans la base, j'économise du temps. Vous me direz : "bien vu l'aveugle ! Voici l'exemple : Code C# :
et avec criteria Code C# :
Je me dis donc que la faute doit venir du nombre d'information que je fais remonter. Je vais donc essayer de jouer avec le LazyLoad. Je clôturerai ce topic si les résultats sont concluant avec le LazyLoad. Encore merci pour votre aide Bien à vous |
||||
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Bonjour à tous
Bien... je n'ai toujours pas trouvé les raisons de ces lenteurs. J'utilise le LazyLoad par défaut pour chacune de mes entités mais ça ne change rien. Ce que je fais donc, c'est d'utiliser les criteria au lieu de la fonction GetBy. C'est pas vraiment une solution mais ça fonctionne. Bien à vous |
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() |
Avez vous regardé la différence au niveau des requetes SQL qui passent sur le serveur?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() |
J'ai l'impression que vous faites deux choses différentes:
Sauf erreur de ma part( je ne connais pas super bien NH...) avec le getBy vous interrogez la base contact puis vous faites contact.screening. Avec les criteria vous interrogez directement la table screening... cela peut faire une enorme différence... JE vous engage à regarder les deux requêtes SQL générées
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
|
|
00
|
|
|
#10 | ||
![]() ![]() ![]() |
Citation:
Citation:
Mais je soutiens la position de iberserk qui demande la comparaison des requêtes renvoyées par l'ORM. Cordialement;
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
||
|
|
00
|
|
|
#11 | |
|
Expert Confirmé
![]() |
Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
|
|
|
00
|
|
|
#12 |
![]() ![]() ![]() |
De toutes les façons tu connais ma position quand à l'utilisation des ORM et le seul conseil que je peux donner ici, c'est d'essayer de filtrer au maximum les données et de faire du paging si possible. Généralement nous n'avons pas besoins de remonter plus de 1000 lignes par exemple, mais c'est vraiment à titre indicatif.
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 238 ![]() |
La personne est un contact, qui lui même a des personnes qui sont des contacts....
C'est une erreur systèmatique ! La seule chose à faire systèmatiquement c'est de regarder le code SQL généré. Ensuite quand on doit travailler sur des filtres et des requêtes de se poser la question des indexes et tris. L'exemple sur le screening en est la preuvre : Le criteria n'est pas fait sur la même entité... Dans le cas 1; il faut initialiser le contact (et donc toutes les associations mappées) Dans le cas 2, c'est sur l'entité recherchée avec le bon filtre. Heureusement que 2 est plus performante que 1... La morale de l'histoire c'est : Code :
|
||
|
|
00
|
|
|
#14 | |||||||||||||
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Bonjour
Merci de vos réponses. Citation:
Ceci étant dit, pouvez préciser la remarque suivante ? Merci ! ![]() Citation:
![]() En effet ceci : Code SQL :
n'est pas vraiment différent de cela : Code SQL :
Mais aujourd'hui j'ai découvert que NHibernate gérer ses log avec log4net. J'ai donc ajouter un petit App.config qui ouvre toutes les vannes des log ainsi que le code suivant dans le SetUp de mon projet NUnit Code C# :
Le résultat est incroyable... plein (*10E1000) de log Premier test : Session.GetBy(string id); => sans criteria Code :
Code :
Je crois donc que mes premiers tests ont été très mal réalisés (my bad ) et que finalement il n'y a pas vraiment de différence. Mais que surtout il n'y a pas de solution à mon problème de lenteur... c'est lent et puis c'est tout ! Mais avant de totalement baisser les bras pourriez vous me donner quelques indices sur la manière : Citation:
Bien à vous |
|||||||||||||
|
|
00
|
|
|
#15 |
![]() ![]() ![]() Nathanael MarchandExpert .Net So@t Inscription : octobre 2008 Messages : 3 521 ![]() |
Et le plan d'execution de cette requete, il donne quoi?
__________________
Retrouvez moi sur : |
|
00
|
|
|
#16 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 163 ![]() |
Hibernate est l'un des pire ORM au monde. Lisez les deux articles suivants et abandonnez l'idée d'avoir des performances avec hibernate ou bien abandonnez hibernate pour avoir des performances :
1) Hibernate 24 fois plus lent qu'une requête UPDATE SQL équivalente : http://ormeter.net/images/stories/re...erformance.png Dans la ligne UpdateInstance, en 1 minute SQL à fait 16 738 UPDATE tandis que NHibernate en à fait 683 !!! 2) Le danger de ORM : http://img1.lemondeinformatique.fr/f...s-epaisses.pdf A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
01
|
|
|
#17 |
![]() ![]() ![]() |
Et si la requête SQL n'était pas la cause ?
Pouvez-vous nous donner le nombre de requête/s ?
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 238 ![]() |
Encore une intervention à forte valeur ajoutée avec des références écrites par des personnes qui n'y comprennent pas grand chose...Bref... passons, et mettons les mains dans le camboui : il y a moyen de voir le code dans son intégralité ?
C'est à dire tous les mappings avec toutes les associations et les configs ? Même avec le log, il faudrait voir toute la matérialisation des objets. A vue de nez, ça ne peut pas venir de nhibernate, le cas semble trop standard. Donc à investiguer. |
|
|
00
|
|
|
#19 |
![]() ![]() ![]() |
Je commence vraiment à croire que beaucoup de gens utilisent les outils en se basant sur la pub sans bien les comprendre. Un ORM, ca fait de la traduction entre le SQL et Le monde Object, comment voulez-vous qu'il soit si performant que ça, c'est un traducteur .., il vaut mieux comprendre la langue maternelle, c'est aussi simple que ca.
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
01
|
|
|
#20 |
|
Expert Confirmé
![]() |
Hum...
Le problème est qu'ils sont utilisés... c'est un fait... A nous de jouer notre rôle et de minimiser l'impact sur les performances... Le problème et que déjà qu'on ne peut pas demander à 10% des développeurs de soigner leur accès aux données... les ORM n'arrangent rien car ils sont nativement plus lents... en apportant des lourdeurs qui ne sont pour moi pas de leur responsabilité...c'est un fait. Donc oui on ne percevra pas la différence dans 75% des petites applications de gestion mais le problème se posera sur de 'vrai' applications ou quand ces applications seront déployées dans des environnement à forte sollicitations... J'ai recemment vu sur ce forum un développeur extremement content d'avoir baissé de 50 secondes(il redémarrais le service SQL SERVER dans un foreach ou quoi )à ... 3 secondes pour l'ouverture d'un node de treeview!!!Vous savez ce qu'il me dit mon client s'il attends deux secondes sur son site d'ebusiness??? Tiens ben je préfère pas vous le dire... On a pas la même conception de la performance.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com