Java 如何避免无状态会话Bean中的并发?
我有一个SLSB,它在一个实体中增加一个数字。如果两个线程同时到达SLSB,那么我在两个请求中得到的数目是相同的 SLSB摘录Java 如何避免无状态会话Bean中的并发?,java,ejb,ejb-3.0,stateless-session-bean,Java,Ejb,Ejb 3.0,Stateless Session Bean,我有一个SLSB,它在一个实体中增加一个数字。如果两个线程同时到达SLSB,那么我在两个请求中得到的数目是相同的 SLSB摘录 @Stateless(mappedName = "ejb/CustomerManager") public class CustomerManagerBean implements CustomerManager { ... public String recoverName(int id) { Customer customer = (Cust
@Stateless(mappedName = "ejb/CustomerManager")
public class CustomerManagerBean implements CustomerManager {
...
public String recoverName(int id) {
Customer customer = (Customer) em.createQuery("from Customer where id = :id").setParameter("id", id).getSingleResult();
int oldValue = customer.getValue();
int newValue = oldValue + 1;
customer.setValue(newValue);
[BP] return customer.getName() + " value=" + customer.getValue();
}
...
}
@Entity
public class Customer implements Serializable {
@Id
private int id;
private int value;
}
实体提取
@Stateless(mappedName = "ejb/CustomerManager")
public class CustomerManagerBean implements CustomerManager {
...
public String recoverName(int id) {
Customer customer = (Customer) em.createQuery("from Customer where id = :id").setParameter("id", id).getSingleResult();
int oldValue = customer.getValue();
int newValue = oldValue + 1;
customer.setValue(newValue);
[BP] return customer.getName() + " value=" + customer.getValue();
}
...
}
@Entity
public class Customer implements Serializable {
@Id
private int id;
private int value;
}
为了测试这个问题,我在SLSB recoverName方法中用[BP]
标记的行上有一个断点。然后,a从两个分离的浏览器页面进行两次调用。在断点处,两个调用的值是相同的
当第二个调用试图用setter修改值时,它不应该抛出某种异常吗?
我使用JBoss5作为as,MySql或Oracle作为DB(两者都尝试过)
感谢您的帮助如果您在实体中添加了@Version注释字段,您将在刷新时得到一个异常,JPA将使用该字段进行乐观锁定 每次JPA更新一个实体时,它都会比较内存中的版本和数据库中的版本,如果它们不匹配,就会抛出异常。如果它们匹配,则版本将递增 只需将以下内容添加到实体中:
@Column(name = "version")
@Version
private long version;
(当然,还要向数据库中添加相应的列)如果在实体中添加@Version注释字段,则在刷新时会出现异常,JPA将使用该字段进行乐观锁定 每次JPA更新一个实体时,它都会比较内存中的版本和数据库中的版本,如果它们不匹配,就会抛出异常。如果它们匹配,则版本将递增 只需将以下内容添加到实体中:
@Column(name = "version")
@Version
private long version;
(当然,还要将相应的列添加到数据库中)