Je suis en train de changer mon code JPA pour faire usage de threads. J'ai un gestionnaire d'entité séparé et une transaction pour chaque thread.JPA demande atomique/enregistrer pour l'application multithread
Ce que je l'habitude d'avoir (pour l'environnement seul thread) est un code comme:
// get object from the entity manager
X x = getObjectX(jpaQuery);
if(x == null)
{
x = new X();
x.setVariable(foo);
entityManager.persist(x);
}
Avec ce code dans l'environnement multithread Je reçois des clés en double depuis, je suppose, getObjectX retourne null pour une thread, puis ce thread est transféré, le thread suivant appelle getObjextX, obtenant également null, puis les deux threads vont créer et conserver un nouveau X().
Court d'ajouter en synchronisation, est-il un moyen atomique pour obtenir/sauvegarde si-ne-exister avec une valeur JPA ou devrais-je revoir mon approche
EDIT:
J'utilise la dernière EclipseLink et MySql 5.1
EDIT 2:
J'ajouté hit synchronisation ... performances MASSIVE (au point qu'il ne peut pas être utilisé). Aller à rassembler toutes les données sur le fil principal et ensuite faire les créations sur ce fil.
Je dois le faire dans le sens inverse, ce qui crée Foo est hors de mon contrôle, et il est pratiquement garanti d'avoir des doublons. Je vais devoir rassembler toutes les données des threads, puis les stocker dans un seul thread. – TofuBeer