2014-03-06 18 views
0

我在維護一個系統工作,並且發現了一個可以解決的錯誤,如果其他webservice方法以某種方式同步。該系統使用澤西島休息方法和Spring的JDBC框架 - 我從來沒有見過任何人使用普通的舊Java的「同步」方法的Web服務,所以不知道這是否正確或錯誤。如何同步Java EE容器中的其餘webservices

下面的代碼是如何組織的(只是膚淺的細節)+評論在線:

@Path("/path") 
@Component 
public class WebService { 
    @Autowired 
    private ServiceImpl serviceImpl; 
    ... 
    @POST 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    @Path("/innerPath") 
    public Response method1(@FormDataParam("id") String id) { 
    ... 
    /* this is where I need synchronization 
    * both the verify and insert methods should execute one user at a time 
    * otherwise all users will be able to insert 
    */ 
    boolean v = serviceImpl.verify(); 
    if (v) { 
     serviceImpl.insert(); //once insert succeeds, verify will start to fail 
    } 
    ... 
    } 
} 

@Service 
public class ServiceImpl { 
    @Autowired 
    private DaoImpl daoImpl; 
    ... 
    @Transactional 
    public boolean verify() { 
    boolean v = daoImpl.verify(); 
    return v 
    } 

    @Transactional 
    public void insert() { 
    daoImpl.insert(); 
    } 
} 

@Repository 
public class DaoImpl { 
    private JdbcTemplate jdbcTemplate; 
    ... 
    public boolean verify() { 
    String sql = "...."; 
    ... 
    int count = jdbcTemplate.queryForInt(sql); 
    if (count > 0) { 
     return false; 
    } 
    return true; 
    } 

    public void insert() { 
    String sql = "...."; 
    ... 
    jdbcTemplate.queryForInt(sql); 
    } 
} 

回答

0

我正在使用的第三僞表,其中每個線程將首先嚐試將其獨特的解決併發問題數據作爲記錄,然後繼續進行任何想做的事情。

這個虛擬表的主鍵是一組一列一列映射一個線程所有的唯一數據。

如果併發線程試圖插入到這個虛擬表中,那麼只有一個插入會成功(因爲主鍵約束)。