Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1320 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Hibernate] besoin d'aide pour comprendre mes erreurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Hibernate] besoin d'aide pour comprendre mes erreurs

n°1760973
iviath
Posté le 17-07-2008 à 16:09:47  profilanswer
 

Bonjour tout le monde et plus particulièrement ceux qui si connaissent en Hibernate.
Je vous explique le problème, actuellement je suis entrain de développer une couche middeware avec Hibernate et je galère. Je suis entrain de tester la monté en charge et tout se qui va avec l'aide de Jmeter et je me suis appercu que mon service web ne tien pas pour le moment.
J'enchaine les erreurs de type :
- illegal access to loading collection
- Exception releasing cache locks
- Flush during cascade is dangerous
- java.util.ConcurrentModificationException
- Found shared references to a collection: com.modele.donnees.Departement.Postes
 
Si quelqu'un pourrait m'expliquer l'origine de ces erreurs ça pourrait m'aider à les résoudre.
 
Voici un exemple de code qui genere ce type d erreur avec son fichier de mappy:
 
le mappy:

Code :
  1. <class name="Departement" table="departement" lazy="true">
  2.  <id name="Id" type="integer" column="departement_id">
  3.   <generator class="sequence"/>
  4.  </id>
  5.    
  6.  <property name="NomDepartement" column="nom_departement" type="string" not-null="true" length="50"/>
  7.  <property name="CodeDepartement" column="code_departement" type="string" not-null="true" length="10"/>
  8.  <many-to-one name="Base" column="base_id" not-null="true"/>
  9.  <set name="Postes" inverse="true">
  10.   <key column="departement_id"/>
  11.   <one-to-many class="Poste"/></set>
  12.  <set name="CodeAffectations" inverse="true">
  13.   <key column="departement_id"/>
  14.   <one-to-many class="CodeAffectation"/></set>


 
le code d execution:

Code :
  1. semaphore.acquire();
  2. if (session == null)
  3.  session = connexion.currentSession();
  4. Departement nouveauDepartement = new Departement();
  5. nouveauDepartement.setNomDepartement("nom" );
  6. nouveauDepartement.setCodeDepartement("code departement" );
  7. Base base = (Base)session.get(Base.class, 10));
  8. nouveauDepartement.setBase(base);
  9. base.addToDepartements(nouveauDepartement);
  10. Transaction transaction = session.beginTransaction();
  11. session.save(nouveauDepartement);
  12. transaction.commit();
  13. semaphore.release();


 
J'attend vous conseil et réponse, car ça fait 1 semaine que je cherche à resoudre mes problèmes mais je galère vraiment beaucoup.


---------------
En informatique, il n'y a pa de solution, que des problèmes :)
mood
Publicité
Posté le 17-07-2008 à 16:09:47  profilanswer
 

n°1761006
iviath
Posté le 17-07-2008 à 17:01:39  profilanswer
 

iviath a écrit :


- illegal access to loading collection


 
Il semblerait que cette erreur apparée lors de l'exécution de méthodes propres à une session (par exemple: load, get), alors que la session est fermée.


---------------
En informatique, il n'y a pa de solution, que des problèmes :)
n°1761018
iviath
Posté le 17-07-2008 à 17:49:07  profilanswer
 

iviath a écrit :


Il semblerait que cette erreur apparée lors de l'exécution de méthodes propres à une session (par exemple: load, get), alors que la session est fermée.


Une fois se bug corriger toutes les erreurs ci-dessus ont disparu. Cependant, une nouvelle erreur est apparue
Maintenant le problème se situe au niveau du cache: il me retourne l'unique erreur, The org.hibernate.cache.UpdateTimestampsCache Cache is not alive. Quelqu'un pourrait me dire se que cela veut dire et se que je peux faire pour résoudre ca? (J'ai remarqué que si la session n'est pas fermer l'erreur n'apparait pas mais au bout d'un moment le nombre de connection à la base est saturée)


---------------
En informatique, il n'y a pa de solution, que des problèmes :)
n°1761025
el muchach​o
Comfortably Numb
Posté le 17-07-2008 à 18:06:46  profilanswer
 

Je ne connais malheureusement pas Hibernate (pas bien en tout cas), mais ton usage de sémaphore m'interpelle. Son utilité me parait extrêmement discutable, et de toute façon, mettre un sémaphore pour locker tout ça, tu veux enterrer les perfs de ton appli ou quoi ?
Vire ton sémaphore (qui à mon avis est totalement inutile) et réessaye.

 

Ensuite, je pense qu'il faut utiliser l'attribut "lazy" avec précautions et savoir parfaitement ce que l'on fait quand on l'utilise.

 

Enfin, je serais toi, je mettrais ce code dans un try {...} catch() avec une gestion de rollback en cas de levée d'exception (lire la doc Hibernate avant ne me parait pas inutile).

Message cité 2 fois
Message édité par el muchacho le 17-07-2008 à 18:13:21

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1761320
iviath
Posté le 18-07-2008 à 11:10:22  profilanswer
 

Apres observation les sémaphore ne sont pas adaptées


Message édité par iviath le 18-07-2008 à 11:16:29

---------------
En informatique, il n'y a pa de solution, que des problèmes :)
n°1761328
iviath
Posté le 18-07-2008 à 11:14:42  profilanswer
 

el muchacho a écrit :

Je ne connais malheureusement pas Hibernate (pas bien en tout cas), mais ton usage de sémaphore m'interpelle. Son utilité me parait extrêmement discutable, et de toute façon, mettre un sémaphore pour locker tout ça, tu veux enterrer les perfs de ton appli ou quoi ?
Vire ton sémaphore (qui à mon avis est totalement inutile) et réessaye.


J'avais des problèmes au niveau de l'accé concurrent de mes fonctions. Dés lors, j'ai essayer d'utiliser des sémaphore pour résoudre tout cela. Cependant, je suis entrain de regarder si je peux les virer donc cela n'est pas définitif. Mais je te rassure je compte les virer.

el muchacho a écrit :


Ensuite, je pense qu'il faut utiliser l'attribut "lazy" avec précautions et savoir parfaitement ce que l'on fait quand on l'utilise.


Je me suis déjà occupé du lazy loading, je ne charge que les objtes qui m'intéresse vraiment sans pour autant surcharger le cache.

el muchacho a écrit :


Enfin, je serais toi, je mettrais ce code dans un try {...} catch() avec une gestion de rollback en cas de levée d'exception (lire la doc Hibernate avant ne me parait pas inutile).


J'ai déjà mit les try et catch, mais afin de ne pas surcharger le code je ne l'ai pas copier ici. Mais le rollback et tout se qui va avec est déjà géré.
 
Actuellement, je viens de résoudre une bonne partie de mes problèmes, cependant il demeure une erreur récurrente. Il me dit non stop cache is not alive. J'ai cru comprendre que cela venait du fait que je reconstruir non stop une sessionFactory, se qui écrase mon cache en cours d'utilisation et génère cette erreur. Je pense donc que ma fonction de connexion n'est pas bonne. Tu m'avais parlé du pattern open view session, pourrais tu me donner un exemple et me dire ces effets de bords car, j'ai pas vraiment compris sont fonctionnement?
 
voici ma fonction de connexion

Code :
  1. public class connexion
  2. {
  3. private static final SessionFactory sessionFactory;
  4. static
  5. {
  6.  try
  7.  {
  8.   sessionFactory = new Configuration().configure().buildSessionFactory();
  9.  }
  10.  catch (HibernateException ex)
  11.  {
  12.   throw new RuntimeException("Exception building SessionFactory: "+ ex.getMessage(), ex);
  13.  }
  14. }
  15. public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
  16. public static Session currentSession() throws HibernateException
  17. {
  18.  Session s = (Session) session.get();
  19.  if (s == null)
  20.  {
  21.   s = sessionFactory.openSession();
  22.   session.set(s);
  23.  }
  24.  else
  25.   if (!s.isConnected())
  26.    s.reconnect();
  27.  return s;
  28. }
  29. public static void closeSession() throws HibernateException
  30. {
  31.  Session s = (Session) session.get();
  32.  session.set(null);
  33.  if (s != null)
  34.   s.close();
  35.  // sessionFactory.close(); mise en commentaire afin d eviter le cache is not alive mais au bout d un moment ceci obtient le message can open connection
  36.                // donc cela veut dire que les connections ne sont pas fermer correctement
  37. }
  38. }


J'ai l'impression qu'a chaque fois que j'appelle connexion.closeSession ça ne ferme pas correctement la session et si je remet le sessionFacory close j'ai le problème du cache is not alive


---------------
En informatique, il n'y a pa de solution, que des problèmes :)
n°1761491
el muchach​o
Comfortably Numb
Posté le 18-07-2008 à 13:53:21  profilanswer
 

Houlala, je comprends rien à ton code.[:psyko]
1. l.4-14  ça compile, ça ??
2. à quoi sert ton thread ?
3. qu'est censé faire currentSession() ??
4. as-tu lu la doc d'Hibernate ? As-tu regardé des exemples d'utilisation ? Je n'en ai pas l'impression.

 

"Tu m'avais parlé du pattern open view session, pourrais tu me donner un exemple et me dire ces effets de bords car, j'ai pas vraiment compris sont fonctionnement"

 

Effets de bord ? Il n'y en a pas quand c'est correctement implémenté. C'est pourtant pas très dur.
Tu appelles une méthode qui ouvre la session, tu utilises la session ouverte, et à la fin tu la fermes, quoi qu'il arrive, en appelant le close dans un finally. [:spamafote]
Et tu t'appuies sur les mécanismes déjà présents d'Hibernate pour la gestion de caches, de concurrence, etc. Autrement dit tu n'as pas à te soucier de ça.

Message cité 1 fois
Message édité par el muchacho le 18-07-2008 à 13:58:34

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1761533
iviath
Posté le 18-07-2008 à 14:26:06  profilanswer
 

el muchacho a écrit :

Houlala, je comprends rien à ton code.[:psyko]


J ai prit ca dans un tutorial pour hibernate donc je pourrais pas t'expliquer a quoi sert le currentSession dans les détails car ça m'echappe moi même.  :ange:

Citation :


1. l.4-14  ça compile, ça ??


Je connaissais pas non plus mais ça marche sinon je pourrait même pas effectuer de requête
[quotemsg=]
4. as-tu lu la doc d'Hibernate ? As-tu regardé des exemples d'utilisation ? Je n'en ai pas l'impression.
[/quotemsg]
Ben je me suis tapé une bonne partie de la doc de hibernate mais pas l'intégralité, non. Les sessions j'ai rien compris :(, c'est pour ça que je demande de l'aide. J'ai juste vu le mécanisme de base, c'est tout.

Citation :


Effets de bord ? Il n'y en a pas quand c'est correctement implémenté. C'est pourtant pas très dur.


J'ai entendu parler plusieurs fois des effets de bords de cette méthode malheureusement, ils sont jamais rentrés dans les détails.

Citation :


Tu appelles une méthode qui ouvre la session, tu utilises la session ouverte, et à la fin tu la fermes, quoi qu'il arrive, en appelant le close dans un finally.


En gros c'est :

Code :
  1. Session s = sessionFactory.openSession();
  2. // exécution de code
  3. finally
  4. {
  5. s.close;
  6. }


Personnellement je suis tombé sur des trucs bien complexes ça me surprend que ça soit juste ça, c'est pour ca que je demandai de l'aide. Je vais tester et on verra se que ça donne.

 

Pour info cette classe se approche du pattern session per request (http://www.hibernate.org/207.html)
et le pattern open session per view c est (http://www.hibernate.org/43.html), mais ca ressemble pas à se que tu m'as dit et j'ai rien compris a la page.


Message édité par iviath le 18-07-2008 à 14:33:36

---------------
En informatique, il n'y a pa de solution, que des problèmes :)
n°1761622
iviath
Posté le 18-07-2008 à 15:35:47  profilanswer
 

Je viens de tester la connection classique:

 

private static final SessionFactory factory = new Configuration().configure().buildSessionFactory();
session = factory.openSession();
// traitement
}
 catch (Exception ex)
{
 new RapportErreur(ex,classe);
 this.erreur=true;
}
finally
{
 try{session.close();}
 catch(Exception ex){}
}

 

et quand j'ai plus de 10 threads ça me met Cannot open connection
Quelqu'un a une idée?


Message édité par iviath le 18-07-2008 à 15:36:10

---------------
En informatique, il n'y a pa de solution, que des problèmes :)
n°1761646
el muchach​o
Comfortably Numb
Posté le 18-07-2008 à 15:46:51  profilanswer
 

Ton pool de connexions est limité à 10 ?

 

Pour la session/view, tu ne comprends pas parce que j'ai l'impression qu'il te manque des connaissances sur le fonctionnement des servlets. Demande de l'aide dans ton entourage parmis les gens qui connaissent la programmation web en Java ou lis le J2EE Tutorial de Sun (attention, grosse lecture).


Message édité par el muchacho le 18-07-2008 à 15:52:20

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
mood
Publicité
Posté le 18-07-2008 à 15:46:51  profilanswer
 

n°1761666
iviath
Posté le 18-07-2008 à 16:06:31  profilanswer
 

Si tu parle du cycle de vie des servlets je connais le mécanisme et les principaux états. Après je suis d'accord avec toi que je manque de connaissance en J2EE.

 

Pour le pool de connection, je ne sais pas comment on fait pour voir et comment le régler (au niveau de TomCat?). Cependant, je me demandais si c'était pas au niveau de Postgres qu'il me limitait le nombre de connection ou si tout simplement je créer pas trop d'instance de session au niveau de postGres?


Message édité par iviath le 18-07-2008 à 16:07:06

---------------
En informatique, il n'y a pa de solution, que des problèmes :)
n°1761678
iviath
Posté le 18-07-2008 à 16:18:38  profilanswer
 

Je viens de regarder pour le pool de connexion, je vais tester c3p0 (donc regler dans hibernate.cfg.xml)


Message édité par iviath le 18-07-2008 à 16:19:17

---------------
En informatique, il n'y a pa de solution, que des problèmes :)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Hibernate] besoin d'aide pour comprendre mes erreurs

 

Sujets relatifs
besoin d aide script de protection allopassProgrammation aide?
Besoin d'aide pour la réalisation d'une fct avec compteur décompteurPetite aide pour finir mon site
expression régulièrerecherche aide
Aide pour une macro excelBesoin renseignement modele EAV ( Entity Attribute Value model)
Plus de sujets relatifs à : [Hibernate] besoin d'aide pour comprendre mes erreurs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR