J'utilise Hibernate pour accéder à mes données Oracle et le cache de niveau 2 pour les données du référentiel. J'utilise le système de version pour gérer la concurrence d'accès. J'ai un problème de rafraichissement des pages. Un utilisateur sauvegarde des données et la page n'est pas rafraichie correctement. Exemple :
Utilisateur A sur poste A avec login "ges".
Utilisateur B sur poste B avec login "ges". (poste n'ayant jamais accédé à l'application)
L'utilisateur A modifie la Mobilite d'identifiant 44. (données bien modifiées en base) Il va ensuite sur la recherche des Mobilite et cherche la 44. L'affichage lui donne parfois l'ancienne version.
Même chose pour B où il ne peut pas y avoir de cahce navigateur car il n'a jamais accédé à l'application.
hibernate.cfg.xml
HibernateSessionFactory.java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ... <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.connection.autocommit">true</property> <property name="hibernate.cglib.use_reflection_optimizer">false</property> <property name="cache.use_second_level_cache">true</property> <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property> <property name="cache.use_query_cache">false</property> ... <class-cache class="fr.cg92.stase.business.profil.Profil" usage="read-write" />
Enregistrement d'une Mobilite
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 private static final ThreadLocal threadLocal = new ThreadLocal(); private static final Configuration cfg = new Configuration(); private static SessionFactory sessionFactory; public static Session currentSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null) { if (sessionFactory == null) { try { // cfg.configure(CONFIG_FILE_LOCATION); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } session = sessionFactory.openSession(); threadLocal.set(session); } return session; }
Avec le "session.clear();" il y a moins de pb mais il y en a quand même. J'ai essayé de le remplacer par "session.flush();" ou "session.refresh(mobilite);" mais ce n'est pas mieux.
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 public static void store(Mobilite mobilite) throws StaleObjectStateException, Exception { Session session = HibernateSessionFactory.currentSession(); try { session.beginTransaction(); session.saveOrUpdate(mobilite); session.getTransaction().commit(); session.clear(); } catch (StaleObjectStateException sose) { log.error("Mobilites - store ", sose); session.getTransaction().rollback(); session.clear(); throw new StaleObjectStateException("Mobilites - store ", sose); } catch (Exception e) { log.error("Mobilites - store ", e); session.getTransaction().rollback(); session.clear(); throw new Exception("Mobilites - store ", e); } }
Partager