比如说,如果我想创建一个基于Web的复式预订系统,每个大厅有2个大厅,每天运行4场。我想为每一场演出同步预订座位。
在所有这些中,我只想让D人等待A人完成预订,因为他们预定的是同一个大厅和相同的展示时间。所有其他人都应该能够同时预订。
我的业务层方法以hallName、showId为参数
public int createBooking(String hallName, int showId){
//check if there are any available seats
//access DAO layer to create booking
return bookingId;
}
我无法同步此方法,因为这将使所有预订都等待对方。
我不能使用信号量,因为它不基于参数获取/释放锁。在获取/释放锁时,我必须以某种方式传入一个参数,或者根据show id创建一个预订队列。我不想硬编码的锁数量,因为没有的大厅和显示可能会随着时间的变化。
在Java 6中有什么方法可以做吗?(框架-Spring3/ Server - Websphere7)
可能有一个简单的方法,但恐怕我没有朝正确的方向思考。
发布于 2014-05-14 20:45:02
尝尝这个
public int createBooking(String hallName, int showId){
synchronized ((hallName + showId).intern()) {
//check if there are any available seats
//access DAO layer to create booking
return bookingId;
}
}
发布于 2014-05-14 21:17:01
你可以看看他在现实生活中所做的事情。这是一个典型的建筑问题。
我不打算在这里解释整个模型,为了更短,我甚至会背叛它:
我会用唯一的ID (可能是UUID,或者数据库提供的)和时间戳创建BookingRequested事件,并将这些事件存储在数据库(或内存中的队列)中。
然后,查询处理器将对它们进行处理。它可以锁定内存中的对象,或者您甚至可以决定只有一个线程可以在一个房间上工作,为这个特定的房间提取未处理的请求。如果您不能,并且让远程系统处理相同的数据,那么解决方案可能是乐观锁定。
当对预订作出决定时,这是一个新事件,您也会将其存储在数据库中。它将包含原始请求的引用和结果。
微软有一本免费的pdf书,“探索CQRS和事件源”,有一个非常完整的例子,具有类似的上下文(一个在各种会议上预订场所的系统)。
https://stackoverflow.com/questions/23664644
复制相似问题