Я нахожусь в процессе изменения своего кода JPA, чтобы использовать потоки. У меня есть отдельный менеджер сущностей и транзакция для каждого потока.
То, что я имел обыкновение (для однопоточной среды), было таким кодом:
// get object from the entity manager
X x = getObjectX(jpaQuery);
if(x == null)
{
x = new X();
x.setVariable(foo);
entityManager.persist(x);
}
С этим кодом в многопоточной среде я получаю дубликаты ключей, поскольку, как я полагаю, getObjectX возвращает нуль для потока, затем этот поток заменяется, следующий поток вызывает getObjextX, также получая ноль, и тогда оба потока будут создать и сохранить новый X ().
Если не считать добавления в синхронизацию, есть ли атомарный способ получить / сохранить-если-не-значение с помощью JPA или я должен переосмыслить свой подход
EDIT:
Я использую последнюю версию Eclipselink и MySql 5.1
РЕДАКТИРОВАТЬ 2:
Я добавил синхронизацию ... МАССИВНЫЙ удар по производительности (до такой степени, что его нельзя использовать). Собираем все данные обратно в основной поток и затем создаем их в этом потоке.