Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données > NHibernate
NHibernate Forum d'entraide sur l'utilisation du mappeur objet/relationnel NHibernate.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/08/2011, 17h10   #1
drbarton
Invité de passage
 
Inscription : mars 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 3
Points : 1
Points : 1
Par défaut [NHibernate] Problème temps de chargement

Bonjour,

J'essaye actuellement de charger toutes les données d'un table afin de peupler des listes déroulante. Mais, avec une table qui contient environ 800 entrée, les performances ne sont pas acceptable (entre 20 et 30s par référentiel).

Voici une partie du code :

CommercialName.hbm.xml
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="OPS_OREO.OREO.OPOP.DataModel"
                   assembly="OPS_OREO">
  <class name="CommercialName" table="OPOP_CommercialName" lazy="false">
    <id name="id">
      <column name="Id" />
    </id>
    <bag name="TranslationsList" table="OPOP_CommercialNameTranslation" lazy="false">
      <key column="CommercialNameId" />
      <one-to-many class="CommercialNameTranslation" />
    </bag>
  </class>
</hibernate-mapping>
CommercialNameTranslation.hbm
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="OPS_OREO.OREO.OPOP.DataModel"
                   assembly="OPS_OREO">
  <class name="CommercialNameTranslation" table="OPOP_CommercialNameTranslation" lazy="false">
    <composite-id>
      <key-property name="commercialNameId">
        <column name="CommercialNameId" sql-type="integer" not-null="true"/>
      </key-property>
      <key-property name="languageId">
        <column name="languageId" sql-type="nvarchar" not-null="true"/>
      </key-property>
    </composite-id>
    <property name="label" column="name" />
  </class>
</hibernate-mapping>
chaque CommercialName possède plusieurs traductions. Lorsque que je fais un RetrieveAll sur cette table, c'est extrêmement long.

Quelqu'un aurait-il une idée ?

Merci
drbarton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 17h08   #2
B.AF
Membre Expert
 
Inscription : février 2005
Messages : 1 238
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 238
Points : 1 655
Points : 1 655
Ce qui est logique; en rapprochant le graph (qui donc 800 objets * nombre de traductions); ce qui fait la matérialisation de plusieurs miliers d'objets en mémoire, dans une session, donc avec le track changing.

Si il s'agit juste de lier une combo :
- une session stateless sera suffisante
- il vaut mieux créer un mapping spécifique basé sur SELECT sur une vue en read only

D'une façon générale, c'est un contre emploi de matérialiser des objets juste pour initialiser une combo box.

Dans ces cas, le datareader de la connection Nhibernate ou la méthode ci-dessus te donnrait plus de satisfaction.

Pour comprendre la logique, si tu avais besoin de deux champs dans une table, tu ferais select champ1, champ2 from matable, pas un select sur l'ensemble des données avec le produit cartésien des relations.

En revanche, pour 800 objets et vu le graph, 20s me paraissent énormes, as-tu le code ?

PS : il se peut que le thread soit subitement envahi de posts qui te diront que l'orm c mal et que le SQL pur c'est mieux, c pas très grave.
B.AF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 15h22   #3
drbarton
Invité de passage
 
Inscription : mars 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 3
Points : 1
Points : 1
Merci pour ta réponse, J'ai du coup fractionner le chargement de l'objet en plusieurs étapes afin qu'il ne me charge pas tout le referentiel et de filtrer ce dont j'ai besoin
drbarton est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h50.


 
 
 
 
Partenaires

Hébergement Web