Я задал аналогичный вопрос на форуме Code Review, но мне было предложено задать этот вопрос здесь. Меня интересует ключевое слово synchronized
в веб-методе ниже. Поскольку setPerson
вызывается из пула потоков (что означает, что могут быть вызваны разные потоки), я должен каким-то образом синхронизировать его. Пул thead используется EclipseLink, когда мой клиент делает SOAP-вызовы методу. Мой вопрос в том, является ли хорошей практикой создание веб-метода synchronized
или я могу выполнить синхронизацию с em.lock(person, WRITE)
?Хорошая практика для синхронизации веб-метода при использовании разных потоков?
@Override
public synchronized void setPerson(Person person) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersonLibPU");
EntityManager em = emf.createEntityManager();
if(!em.getTransaction().isActive()) {
em.getTransaction().begin();
}
try {
person.setPersonId(getLastInsertedId() + 1); // Get the last inserted ID and increment it by 1
em.merge(person);
em.getTransaction().commit();
emf.getCache().evict(Person.class);
} catch (Exception ex) {
if(em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
}
РЕДАКТИРОВАТЬ
Я добавил еще одну строку в приведенной выше, где я установить значение первичного ключа объекта кода человека. Для этого синхронизация выполняется, а не для каких-либо общих объектов Java. Мне нужно синхронизировать его, чтобы два потока не могли получить один и тот же первичный ключ.
Код использует только локальные переменные. Почему вы хотите синхронизировать его. Сторона не: вы не должны создавать новый EntityManagerFactory в каждом методе. Создайте его один раз и всегда используйте уникальный экземпляр. –
Да, переменные являются локальными, но это транзакция базы данных, которую я боюсь. Два или более потока могут потенциально вызывать setPerson() и записывать один и тот же первичный ключ, поскольку PK: s не увеличиваются автоматически. Таким образом, синхронизация не для общего объекта Java, а для доступа к базе данных. – Rox
Тогда вам понадобится обработать эту возможность, обработав потенциальное исключение, которое может быть выбрано. Синхронизация не является правильным решением, поскольку она не будет обрабатывать случай, когда человек будет сохранен другим методом, или человек будет сохранен другим приложением или человек будет сохранен другой JVM в кластере. –