Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Inscrit en
    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

  2. #2
    Membre Expert
    Inscrit en
    mars 2005
    Messages
    1 243
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 243
    Points : 1 856
    Points
    1 856

    Par défaut

    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.

  3. #3
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    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

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •