コード レビュー フォーラムで同様の質問をしましたが、ここでその質問をするように提案されました。synchronized
以下のWebメソッドのキーワードについて疑問に思っています。はスレッド プールから呼び出されるためsetPerson
(つまり、別のスレッドから呼び出すことができる)、何らかの方法で同期化する必要があります。クライアントがメソッドに対してSOAPコールを実行しているときに、EclipseLinkによってスレッド・プールが使用されます。私の質問は、Web メソッドを作成するのが良い方法なのか、それとも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();
}
}
EDIT
上記のコードに、人物オブジェクトの主キー値を設定する行をもう1つ追加しました。これが同期の目的であり、共有 Java オブジェクトの場合ではありません。2 つのスレッドが同じ主キーを取得できないように、同期する必要があります。