Bonjour,
Je rencontre actuellement un crash de mon application où l'erreur remontée est "could not execute jdbc batch update" avec un duplicate entry.
Après analyse, voilà le scénario qui fait planter l'application.
Un utilisateur A branché sur mon appli locale qui pointe sur une base de données distante appelée X
Un utilisateur B branché sur mon appli distance (sur autre instance jboss donc...) pointe la même base de données X que l'applu du user A.
A créer un dossier puis attend.
B créer un dossier puis attend
A veut créer un nouveau dossier et là ca plante!
Mon diagnostique montre qu'hibernate ne se rend pas compte qu'un nouvel ajout a eu lieu en base par un tiers. Donc un problème de cache.
J'ai tenté pleins de choses notamment:
Voici le code de mon saveOrUpdate()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 getHibernateSession().flush(); getHibernateSession().clear(); getHibernateSession().setCacheMode(getHibernateSession().getCacheMode().REFRESH); getHibernateSession().setFlushMode(getHibernateSession().getFlushMode().COMMIT);
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
26
27
28
29 protected Integer saveOrUpdateGetID(Object pObject) { setAutoCommit(false); Transaction uneTransaction = null; Integer unIdGenere = null; try { getHibernateSession().flush(); getHibernateSession().clear(); getHibernateSession().setCacheMode(getHibernateSession().getCacheMode().REFRESH); getHibernateSession().setFlushMode(getHibernateSession().getFlushMode().COMMIT); uneTransaction = getHibernateSession().beginTransaction(); getHibernateSession().saveOrUpdate(pObject); unIdGenere = (Integer) getHibernateSession().getIdentifier(pObject); uneTransaction.commit(); setAutoCommit(true); } catch (Throwable sx) { try { uneTransaction.rollback(); setAutoCommit(true); throw new RuntimeException(sx.getMessage(), sx); } catch (HibernateException e) { Logger.getLogger( " error during rollback (save or update) " + e.getMessage()); HibernateSession.fermerSession(); } } finally { HibernateSession.fermerSession(); } return unIdGenere; }
Quelqu'un aurait une piste pour moi? Car je suis vraiment bloqué.
Merci d'avance.
Vince
Partager