IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Enorme base de données, problème de mémoire


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 21
    Points
    21
    Par défaut Enorme base de données, problème de mémoire
    Bonjour,

    J utilise actuellement Hibernate avec Oracle et je rencontre un problème dont je ne trouve pas de solution.

    Voila mon soucis

    Chaque jour, la base de données va devoir enregistrer au minimun 100k d'entrées dans la table B.
    La table B a une Foreign Key qui la relie à la Table A;

    Donc avec hibernate, un Objet A possède un Set d'objet B et à chaque nouvelle enregistrement, j'ajoute un Objet B dans le Set de l'Objet A.
    Mais lors de cette instruction, mode lazy, hibernate me fait un select * et j'obtiens rapidement un problème de mémoire.

    Je cherche donc une solution à ce problème. je ne trouve pas de piste pour l'instant

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour,
    Peut on voir ton code?
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Voila le code en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    TableB tableb = new Table();
     
    tableb.setAttribut1();
    ...
    tableb.setAttrbut10();
     
    // je fais mon lien avec la table A
     
    tableb.setTableA(tablea);
    tablea.add(tableb);
    et le mapping

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     <set name="tablebs" table="TABLEB" inverse="true" cascade="all">
                <key>
                    <column name="FKIDTABLEA" precision="11" scale="0" />
                </key>
                <one-to-many class="com.hibernate.Tableb" />
            </set>

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    On peux voir ton code d'insertion? Puisque c'est lui le coupable. Le code que tu nous as montré ne montre ni comment tu récupère tableA, ni comment tu sauve, ni comment tu gère tes lignes.

    De plus, vu ton mapping, comme c'est tableB qui gère la relation (inverse=true sur la propriété TableA.tablebs) et que ce que tu cherche, c'est d'insérer uniquement des TableB, inutile de charger TableA, pour hibernate:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tablea.getTablesBs.add(tableb);
    N'as aucune utilité , Tout ce qu'il va controler lors du save, c'est TableB.tableA

    Il n'est important de faire le lien Bidirectionnel que si tu a besoin dans l'immédiat de parcourir TableA.tablesB, ce qui ne semble pas être le cas, et ça pourra attendre d'être corrigé au prochain chargement

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    je vous remercie de vos réponses.

    si tu a besoin dans l'immédiat de parcourir TableA.tablesB, ce qui ne semble pas être le cas
    Oui je n'ai pas besoin de TABLEA.tableB mais je faisais mon save au niveau de ma TableA pour éviter de faire un nombre trop élevé de save et de commit. D'ou la nécessité de faire mon tableA.getTableb.add(tableb).

    je recupère ma table A avec un criteria très simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Criteria crit = session.createCriteria(TableA.class);
    crit.add(Restrictions.eq("attribut1", variable));
    List result = (List) crit.list();
    puis il y a la création et l'insertion des objets de la tableB dans la tableA
    et enfin ( je vous évite le code qui gère les exceptions :p )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Transaction transaction  = session.beginTransaction();
    session.save(tableA);
    transaction.commit();
    session.close();
    Si j'ai bien compris, je vais devoir faire un save au niveau de la tableB et faire un commit par table A ( ou vaudrait il mieux faire un commit a la fin ? c'est à dire après les insertions de tous les tablesB dans tous les tableA, ce qui correspondrait à >200k )

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Faire ton save au tableA ne va pas réduire le nombre d'appel à insert dans ta base de données => fait le save sur chaque tableB. De toutes façons, un save sur table A ne fera en interne que créer N saves sur les N éléments de la collection tableA.b


    Pour l'insertion massive de données, il y a une doc sur le site d'hibernate que je te suggère de lire et qui précise exactement comment procéder.

    http://docs.jboss.org/hibernate/orm/...tml/batch.html

Discussions similaires

  1. Insertion jTable et Base de données problème
    Par Ercan67000 dans le forum Composants
    Réponses: 3
    Dernier message: 24/01/2012, 14h30
  2. Réponses: 2
    Dernier message: 14/05/2011, 17h28
  3. Réponses: 4
    Dernier message: 19/02/2010, 16h36
  4. Simili base de données mais en mémoire
    Par Louis-Guillaume Morand dans le forum Langage
    Réponses: 12
    Dernier message: 29/07/2007, 21h51
  5. Base de données en mode mémoire
    Par Lebas dans le forum JDBC
    Réponses: 5
    Dernier message: 08/02/2007, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo