Sono in procinto di cambiare il mio codice JPA in giro per utilizzare i thread. Ho un gestore di entità e una transazione separate per ogni thread.Richiesta/salvataggio atomico JPA per l'applicazione multithreading
Quello che ho usato per avere (per l'ambiente filettata singola) era il codice come:
// get object from the entity manager
X x = getObjectX(jpaQuery);
if(x == null)
{
x = new X();
x.setVariable(foo);
entityManager.persist(x);
}
Con quel codice in un ambiente multi-threaded sto ottenendo chiavi duplicate dal momento che, presumo, getObjectX restituisce null per un thread, quindi quel thread viene scambiato, il thread successivo chiama getObjextX, ottenendo anche null, e quindi entrambi i thread creeranno e persisteranno una nuova X().
corta di aggiungere nella sincronizzazione, c'è un modo per ottenere atomica/salva-se-Indifferente-esistere un valore con JPA o dovrei ripensare il mio approccio
EDIT:
sto usando l'ultima EclipseLink e MySql 5.1
EDIT 2:
ho aggiunto la sincronizzazione ... calo di prestazioni MASSIVE (al punto che essa non può essere utilizzato). Andando a raccogliere tutti i dati di nuovo sul thread principale e quindi fare le creazioni su quel thread.
Devo farlo al contrario, ciò che crea Foo è fuori dal mio controllo ed è praticamente garantito avere duplicati. Dovrò raccogliere tutti i dati dai thread e poi archiviarli tutti in un unico thread. – TofuBeer