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 :

outOfMemory avec le mapping de plusieurs lignes


Sujet :

Hibernate Java

  1. #1
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut outOfMemory avec le mapping de plusieurs lignes
    bonjour,

    j'ai une requete avec DetachedCriteria, qui récupere beaucoup de ligne de la base..qq milliers de lignes..

    qd le résultat dépasse un certain nombre de ligne..vers 1000, j'ai un outOfmemory,

    est ce un probleme de config? peut on mapper des milliers d'objets avec hibernate ?

    la config hibernate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
    <property name="driverClassName">
    <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
    </property>
    <property name="url">
    <value>
    url
    </value>
    </property>
    <property name="username">
    <value>user</value>
    </property>
    <property name="password">
    <value>mdp</value>
    </property>
    </bean>
    <!-- Hibernate Session Factory Bean -->
    <bean
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
    id="sessionFactory">
    <property name="mappingResources">
    ..
    ..
    ..
    merciiiiiii

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    y'a t'il beaucoup d'objets et de relations et utilises tu le lazy loading dans tes mappings d'association ?

    si tu n'utilises pas le lazy loading alors oui tu peux arriver à un dépassement de mémoire, puisqu'à travers les associations hibernate va essayer de charger toute ta base en mémoire...

  3. #3
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    et les proprietes hibernate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <prop key="hibernate.cache.provider_class">
    org.hibernate.cache.EhCacheProvider
    </prop>
    <prop key="hibernate.max_fetch_depth">3</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.format_sql">true</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>
    <prop key="hibernate.cache.use_second_level_cache">
    true
    </prop>
    <prop key="hibernate.jdbc.bach_size">20</prop>
    <prop key="hibernate.connection.release_mode">
    auto
    </prop>
    <prop key="default_schema">[dbo]</prop>
    </props>
    </property>

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    y'a t'il beaucoup d'objets et de relations et utilises tu le lazy loading dans tes mappings d'association ?

    si tu n'utilises pas le lazy loading alors oui tu peux arriver à un dépassement de mémoire, puisqu'à travers les associations hibernate va essayer de charger toute ta base en mémoire...
    non je n'utilise pas la lazy loading, je suis en hibernate 3, j'utilise le JOIN fetching mode pour 2 ou 3 table;
    jai bcq d'objets dans la table principale et la requete est lancé plusieurs fois aussiii donc pas dans la meme session hibernate..

  5. #5
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    donc essaie le lazy loading ou si ça ne te convient pas, tu peux essayer d'utiliser les ScrollableResults

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    donc essaie le lazy loading ou si ça ne te convient pas, tu peux essayer d'utiliser les ScrollableResults

    le probleme ne vient pas du lazy loading..avec ou sans le nombre d'objets est consequent ..

  7. #7
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    utilises des session.clear() régulièrement alors

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Es-tu obligé de retourner autant de lignes à la fois ?
    Ne peux tu pas mettre en place un système de pagination pour renvoyer moins de données ?
    Quel est exactement le contexte ?
    Dois tu afficher ces données ?
    Peut-être qu'avec un peu plus d'infos on pourra mieux t'aider.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    1000 objets c'est pas énorme en soit, sauf si chacun a une taille énorme. Je travaille régulièrement avec des sessions de 10k+ objets sans problèmes et avec moins de 100M de mémoire consommée.

    Combien de mémoire est allouée à la JVM et quelle tête on les objets ?

  10. #10
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Es-tu obligé de retourner autant de lignes à la fois ?
    Ne peux tu pas mettre en place un système de pagination pour renvoyer moins de données ?
    Quel est exactement le contexte ?
    Dois tu afficher ces données ?
    Peut-être qu'avec un peu plus d'infos on pourra mieux t'aider.
    ouii je suis obligé,je dois afficher quelques informations pour des utilisateurs, l'object conctient juste des infos, type nom,prenom..plus plusieurs champs métier de type double. chaque user peut avoir plus de 1000 lignes pour un critère de recherche, et la recherche s'effectue en générale sur tous les users d'une entreprise données (une centaine) .
    je suis obligé de faire n requetes pour m users.

    Citation Envoyé par the-gtm Voir le message
    1000 objets c'est pas énorme en soit, sauf si chacun a une taille énorme. Je travaille régulièrement avec des sessions de 10k+ objets sans problèmes et avec moins de 100M de mémoire consommée.
    Combien de mémoire est allouée à la JVM et quelle tête on les objets ?
    pour l'instant je suis en debug sur mon poste, j'utilise les paramètres par défaut d'eclipse avec tomcat 5.5.
    je vais augmenter la mémoire allouée à la JVM pour tester..

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    maintenant j'ai une autre exception,

    au mileu de ma boucle de recherche, et pas à la premiere requete.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    org.springframework.dao.DataAccessResourceFailureException: Cannot open connection; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection
    Caused by: 
    org.hibernate.exception.JDBCConnectionException: Cannot open connection
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
    	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
    	at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    	at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
    	at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    	at org.hibernate.loader.Loader.doList(Loader.java:2220)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    	at org.hibernate.loader.Loader.list(Loader.java:2099)
    	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
    	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
    	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
    	at org.springframework.orm.hibernate3.HibernateTemplate$35.doInHibernate(HibernateTemplate.java:981)
    	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:369)
    	at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:971)
    	at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:964)
    qqn a une petite idée?

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Sniper37 Voir le message
    maintenant j'ai une autre exception,

    au mileu de ma boucle de recherche, et pas à la premiere requete.


    qqn a une petite idée?

    vous ouvrez des connections qui ne sont jamais refermées et vous épuisez votre quota ?

    si vous avez des paramètres de nombre de connections autorisées : changez-le (de manière "spectaculaire") pour observer le résultat...
    si rien ne change => c'est autre chose…
    sinon revoyez votre logique de connection/session/transaction…

    (attention : si c'est un problème de nombre de connections autorisées, cela peut-être aussi bien côté client que serveur…)

  13. #13
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    je vais utiliser le pool de connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.mchange.v2.c3p0.ComboPooledDataSource
    j'ai juste un problèmle avec le driver sql server qui ne fonctionne pas avec cette DataSource..

    je continu à regarder..

  14. #14
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    je voulais utiliser le pool de connexion C3P0 , mais apparement il n'arrive ouvrir une connexion avec le driver sql server, avant ça marchait bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Caused by: 
    org.hibernate.exception.JDBCConnectionException: Cannot open connection
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
    ...
    caused by: java.sql.SQLException: No suitable driver
    	at java.sql.DriverManager.getDriver(Unknown Source)
    	at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:224)
    	at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:120)
    j'ai loupé qq chose dans la config de hibernate et spring...? ou juste un probleme de C3P0..?

    merciii

  15. #15
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    j'ai toujours le problème de outOfMemory meme avec le pool de connexion C3P0..

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Fait voir ton code parce que je dirais que tu ne ferme pas les connections que tu ouvres et du coup beaucoup de données restent en mémoire

  17. #17
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    j'utilise Spring ..je n'ouvre pas de connexion dans mon code..

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut
    et ben commence par virer spring et gère la session à la main...
    Quand ca marchera, tu remettras spring...

    1000 objets en session c'est pas énorme... a mon avis, tu utilises mal spring, et tu crée une nouvelle session a chaque fois que tu fais une lecture => il pioche dan sle pool de connexion a chaque fois et donc il le vide (le pool)... et a chaque session il remappe des objets qu'il avait précédemment chargé dans les sessions précédentes d'ou le outofmemory... enfin , c'est une hypothèse.

    A la limite fait un test unitaire (un main() ) qui;

    initialise SessionFactory
    ouvre une session (avec getCurrentSession())
    Demarrer une transaction

    Faire toutes operation de lecture nécessaires.


    commiter tx
    fermer session
    fermer sessionFactory


    et dit nous ce que ca donne...

    Mon feeling: le pb ne vient pas d'hibernate mais plutot à l'usage que Spring en fait et donc à l'usage que tu fais de spring...

    Citation Envoyé par Sniper37 Voir le message
    j'utilise Spring ..je n'ouvre pas de connexion dans mon code..

  19. #19
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    j'explique ce que je fais..je vais essayé de le faire autrement mais voilà ce qui cause le outOfMemory:

    dans la partie web, hors session hibernate ..

    - je prend des paramètres saisis par l'utilisateur
    - premieres requete hibernate--> une liste (maListe) d'une centaine de lignes;
    - un peu de traitement métier, récuperations de quelques infos ..
    - un boucle sur maListe, et pour chaque element une autre requete qui recupere une liste de 1000 à + 10000 elements..

    donc pour chaque passage dans la boucle une session est ouverte et refermé après..
    peut etre il est mieux de faire tous le traitement dans la meme session..

  20. #20
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    les requetes ne se faisaient pas dans la meme session;

    maintenant, j'utilise que hibernate, je passe la session de la premiere requete en parametre de la fonction qui réalise la deuxème et je 'flush' la session..
    je n'ai pas d'outOfMemory..le résulta donne une Liste de 179100 elements, je ne sais pas si c'est la bonne méthode..

Discussions similaires

  1. [2.x] ManyToMany avec attribut Formulaire sur plusieurs lignes
    Par KLeMiX dans le forum Symfony
    Réponses: 3
    Dernier message: 08/02/2013, 10h31
  2. Réponses: 8
    Dernier message: 07/12/2011, 09h35
  3. Besoin d'aide pour remplacer avec expression régulière sur plusieurs lignes
    Par MediaVistaIntel dans le forum Général Python
    Réponses: 11
    Dernier message: 01/12/2011, 14h19
  4. Réponses: 3
    Dernier message: 28/07/2009, 16h01
  5. lire plusieurs lignes avec fgetc
    Par Mousk dans le forum C
    Réponses: 7
    Dernier message: 25/03/2006, 18h24

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