Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免无状态会话Bean中的并发?_Java_Ejb_Ejb 3.0_Stateless Session Bean - Fatal编程技术网

Java 如何避免无状态会话Bean中的并发?

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

我有一个SLSB,它在一个实体中增加一个数字。如果两个线程同时到达SLSB,那么我在两个请求中得到的数目是相同的

SLSB摘录

@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;
(当然,还要将相应的列添加到数据库中)