Salut,
Je suis entrain d’accéder a la base de donné a partir de hibernate. Ma méthode fait une requête sur deux équipements connecté entre eux. Dans un multithreading, les deux équipements sont exécutés en même temps et créent une connection physique. Afin d'enregistrer cette connection dans la base de donnée, je fait une requête avant pour savoir si cette connection existe déjà ou non. ce qui doit être le cas si un élément enregistre la connectin avant l'autre. Du coup, j'arrive toujour au stade ou les deux équipements dans le multithreading accèdent au meme temps en milliseconde a faire la requête pour savoir si il y a une connection deja ou non. du coup ils utilisent tout les deux la méthode save de Hibernate pour enregistrer .. et la j'ai un problème de duplicated key.
Voici la console:
Key 2 c'est l'indexe unique de la connection. (couple de ports des deux coté de chaque équipement.).12:59:07,312 DEBUG SQL:111 - Requête SQL pour vérifier si une connection existe dans la base de donnée pour l’équipement 1
12:59:07,312 DEBUG SQL:111 - Requête SQL pour vérifier si une connection existe dans la base de donnée pour l’équipement 2
12:59:09,312 DEBUG SQL:111 - Save de connection pour l’équipement 1
12:59:09,312 DEBUG SQL:111 - Save de connection pour l’équipement 2
12:59:11,609 ERROR JDBCExceptionReporter:234 - Duplicate entry '3066-3069' for key 2
Pour resumer. chaque equipement doit verifier si un centree existe deja dans la DB, si elle existe il fait merge de hiberate, sinon il fait save. ducoup il fait toujours save puisque ils verifient au meme temps avec la milliseconde, Du coup aucun equipement n'a lachance de trouver une entree deja existante.
J'ai essayé de contourner le problème avec un synchronized .. mais ça ne change rien. Voici le code appliqué dans le thread pour chaque équipement et qui cause le problème:
La méthode insert or update de hibernate fait une requête sur l'objet, si il existe elle fait merge, sinon save. c'est les fonctions prédéfinies de Hibernate.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if (localNE.getNetworkElementId() == (getNetworkElement().getNetworkElementId())) { PhysicalConnection physicalConnection = localPersistentPtp.radioLink(remotePersistentPtp); logger.debug("Physical Connection should be created: " + getNetworkElement() + " - " + remoteNE); //logger.debug("Physical Connection should be created: " + physicalConnection.getPtpByPtpIdAend().getPtpId() + " - " + physicalConnection.getPtpByPtpIdZend().getPtpId()); phyConns.add(physicalConnection); phyConnHelp.insertOrUpdate(physicalConnection); logger.debug("Basic physical connections (no protection) for: " + getNetworkElement().toString() + " : " + physicalConnection); }
J’espère pouvoir contourner ce problème. Merci d'avance.
Partager