Я в середине меняю свой JPA-код, чтобы использовать потоки. У меня есть отдельный менеджер сущностей и транзакция для каждого потока.JPA атомный запрос/сохранение для многопоточного приложения
То, что я имел обыкновение иметь (для однотридовой среды) был такой код:
// get object from the entity manager
X x = getObjectX(jpaQuery);
if(x == null)
{
x = new X();
x.setVariable(foo);
entityManager.persist(x);
}
С этим кодом в многопоточных среде я получаю дубликаты ключей, так как, я полагаю, getObjectX возвращает нуль для thread, то этот поток поменяется, следующий поток вызывает getObjextX, также получая нуль, а затем оба потока создадут и сохраняют новый X().
Коротких добавлений в синхронизации, есть атомный способ получить/сохранить, если-не-существует значение с JPA или я должен пересмотреть свой подход
EDIT:
Я использую последняя EclipseLink и MySql 5,1
EDIT 2:
Я добавил синхронизацию ... MASSIVE падение производительности (до такой степени, что она не может быть использована). Собираясь собирать все данные вверх по основному потоку, а затем делать творения в этом потоке.
Я должен сделать это в обратном порядке, что создает Foo из-под контроля, и в значительной степени гарантировано наличие дубликатов. Мне нужно собрать все данные из потоков, а затем сохранить их все в одном потоке. – TofuBeer