How can I implement a proper counter bean with EJB 3.0?
- by Aaron Digulla
I have this entity bean:
import javax.persistence.*;
@Entity
public class CounterTest {
private int id;
private int counter;
@Id
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public int getCounter() { return counter; }
public void setCounter(int counter) { this.counter = counter; }
}
and this stateful bean to increment a counter:
import java.rmi.RemoteException;
import javax.ejb.*;
import javax.persistence.*;
@Stateful
public class CounterTestBean implements CounterTestRemote {
@PersistenceContext(unitName = "JavaEE")
EntityManager manager;
public void initDB() {
CounterTest ct = new CounterTest();
ct.setNr(1);
ct.setWert(1);
manager.persist(ct);
}
public boolean testCounterWithLock() {
try {
CounterTest ct = manager.find(CounterTest.class, 1);
manager.lock(ct, LockModeType.WRITE);
int wert = ct.getWert();
ct.setWert(wert + 1);
manager.flush();
return true;
} catch (Throwable t) {
return false;
}
}
}
When I call testCounterWithLock() from three threads 500 times each, the counter gets incremented between 13 and 1279 times. How do I fix this code so that it is incremented 1500 times?