首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java --这是预订系统使用的最佳锁定方法。

Java --这是预订系统使用的最佳锁定方法。
EN

Stack Overflow用户
提问于 2014-05-14 20:36:50
回答 2查看 2K关注 0票数 0

比如说,如果我想创建一个基于Web的复式预订系统,每个大厅有2个大厅,每天运行4场。我想为每一场演出同步预订座位。

  • A人试图预订下午2点在A厅的演出
  • B人试图预订下午6点在A厅的演出
  • C人试图预订B厅下午2点的演出
  • D人试图预订下午2点在A厅的演出
  • E人试图预订B厅下午6点的演出

在所有这些中,我只想让D人等待A人完成预订,因为他们预定的是同一个大厅和相同的展示时间。所有其他人都应该能够同时预订。

我的业务层方法以hallName、showId为参数

代码语言:javascript
运行
复制
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)

可能有一个简单的方法,但恐怕我没有朝正确的方向思考。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 20:45:02

尝尝这个

代码语言:javascript
运行
复制
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;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-05-14 21:17:01

你可以看看他在现实生活中所做的事情。这是一个典型的建筑问题。

我不打算在这里解释整个模型,为了更短,我甚至会背叛它:

我会用唯一的ID (可能是UUID,或者数据库提供的)和时间戳创建BookingRequested事件,并将这些事件存储在数据库(或内存中的队列)中。

然后,查询处理器将对它们进行处理。它可以锁定内存中的对象,或者您甚至可以决定只有一个线程可以在一个房间上工作,为这个特定的房间提取未处理的请求。如果您不能,并且让远程系统处理相同的数据,那么解决方案可能是乐观锁定。

当对预订作出决定时,这是一个新事件,您也会将其存储在数据库中。它将包含原始请求的引用和结果。

微软有一本免费的pdf书,“探索CQRS和事件源”,有一个非常完整的例子,具有类似的上下文(一个在各种会议上预订场所的系统)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23664644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档