Je rencontre des difficultés avec OpenJPA chez certain de nos utilisateurs. Notre logiciel est de type client/serveur et fonctionne dans un environnement JSE. Il arrive parfois que notre client lourd (Swing) se bloque complètement sur une des fonctions de notre logiciel. Ses plantages se produisent de manière pseudo-aléatoire (le programme va parfaitement fonctionner une journée même après plusieurs redémarrage, puis ne plus fonctionner le lendemain). Toutefois, nous avons récemment pu récupérer chez notre client le heapdump du programme au moment du blocage. Après consultation de la pile d’exécution j'ai repéré ce thread :
"RMI TCP Connection(12)-10.67.168.225" daemon prio=5 tid=30 WAITING
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:842)
Local Variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$Node#9
Local Variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$Node#8
Local Variable: java.util.concurrent.locks.ReentrantLock$NonfairSync#797
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1178)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
at org.apache.openjpa.kernel.StateManagerImpl.lock(StateManagerImpl.java)
at org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java)
at org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java)
at com.xxxxx.yyyyy.platform.dto.control.Role.a(<unknown string>)
at com.xxxxx.yyyyy.platform.dto.control.Role.hashCode(<unknown string>)
at java.util.HashMap.put(HashMap.java:372)
Local Variable: java.util.LinkedHashMap#474
at java.util.HashSet.add(HashSet.java:200)
at org.apache.openjpa.util.java$util$LinkedHashSet$proxy.add(<unknown string>)
at org.apache.openjpa.util.ProxyCollections.addAll(ProxyCollections.java)
Local Variable: org.apache.openjpa.util.ProxyCollections$1#1
at org.apache.openjpa.util.java$util$LinkedHashSet$proxy.addAll(<unknown string>)
at org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachField(DetachManager.java)
Local Variable: org.apache.openjpa.util.java$util$LinkedHashSet$proxy#11
Local Variable: org.apache.openjpa.jdbc.meta.FieldMapping#52
at org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.storeObjectField(DetachManager.java)
at org.apache.openjpa.kernel.StateManagerImpl.providedObjectField(StateManagerImpl.java)
Local Variable: org.apache.openjpa.util.java$util$LinkedHashSet$proxy#1
at com.xxxxx.yyyyy.platform.dto.control.Role.pcProvideField(<unknown string>)
at org.apache.openjpa.kernel.StateManagerImpl.provideField(StateManagerImpl.java)
Local Variable: org.apache.openjpa.kernel.SingleFieldManager#21
at org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachField(DetachManager.java)
at org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachFields(DetachManager.java)
Local Variable: org.apache.openjpa.jdbc.meta.FieldMapping[]#19
Local Variable: org.apache.openjpa.jdbc.meta.FieldMapping[]#17
at org.apache.openjpa.kernel.DetachManager.detachInternal(DetachManager.java)
Local Variable: org.apache.openjpa.kernel.DetachedStateManager#1
Local Variable: org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager#1
Local Variable: com.xxxxx.yyyyy.platform.dto.control.Role#7
Local Variable: java.util.BitSet#3815
Local Variable: org.apache.openjpa.kernel.StateManagerImpl#22
at org.apache.openjpa.kernel.DetachManager.access$400(DetachManager.java)
at org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachField(DetachManager.java)
Local Variable: org.apache.openjpa.jdbc.meta.FieldMapping#39
at org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.storeObjectField(DetachManager.java)
at org.apache.openjpa.kernel.StateManagerImpl.providedObjectField(StateManagerImpl.java)
Local Variable: com.xxxxx.yyyyy.platform.dto.control.Role#2
at com.xxxxx.yyyyy.platform.dto.control.User.pcProvideField(<unknown string>)
at org.apache.openjpa.kernel.StateManagerImpl.provideField(StateManagerImpl.java)
Local Variable: org.apache.openjpa.kernel.SingleFieldManager#54
at org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachField(DetachManager.java)
at org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachFields(DetachManager.java)
Local Variable: org.apache.openjpa.jdbc.meta.FieldMapping[]#53
Local Variable: org.apache.openjpa.jdbc.meta.FieldMapping[]#55
at org.apache.openjpa.kernel.DetachManager.detachInternal(DetachManager.java)
Local Variable: org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager#2
Local Variable: org.apache.openjpa.kernel.DetachedStateManager#2
Local Variable: java.util.BitSet#3816
Local Variable: com.xxxxx.yyyyy.platform.dto.control.User#24
Local Variable: org.apache.openjpa.kernel.StateManagerImpl#55
at org.apache.openjpa.kernel.DetachManager.detach(DetachManager.java)
Local Variable: org.apache.openjpa.kernel.DetachManager#1
at org.apache.openjpa.kernel.BrokerImpl.detach(BrokerImpl.java)
at org.apache.openjpa.kernel.DelegatingBroker.detach(DelegatingBroker.java)
Local Variable: org.apache.openjpa.kernel.DelegatingBroker#1
at org.apache.openjpa.persistence.EntityManagerImpl.detachCopy(EntityManagerImpl.java)
Local Variable: org.apache.openjpa.persistence.EntityManagerImpl#1
Local Variable: org.apache.openjpa.conf.Compatibility#1
at com.xxxxx.yyyyy.platform.dao.EntityManagerSingleton.detachCopy(<unknown string>)
Local Variable: com.xxxxx.yyyyy.platform.dao.EntityManagerSingleton#1
Local Variable: com.xxxxx.yyyyy.platform.dto.control.User#8
at dY.registred(<unknown string>)
[...]
La méthode "registred" est appelée depuis la partie serveur de notre logiciel sur notre application client via un appel RMI (pour savoir quel utilisateur accéde à la fonction et qui n'est pas forcement la personne authentifiée au démarrage du programme):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 @Override public User registred() throws RemoteException { User result; try { result = EntityManagerSingleton.getInstance().detachCopy(QualinaxManager.getInstance().getApplicationContext().getCurrentUser()); } catch (Exception ex) { result = null; } return result; }
Partager