首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于预留的Java分布式JPA锁

用于预留的Java分布式JPA锁
EN

Stack Overflow用户
提问于 2019-02-26 06:46:15
回答 3查看 1.4K关注 0票数 11

我正在开发一个支持预约计划的遗留系统。该应用程序是无状态REST,并且被设计为可水平扩展的。但是,数据库在所有实例之间共享。在我得到关于设计和规模的演讲之前,它不是我的--必须充分利用糟糕的情况(或代码库)。最近我们看到了一个重复预订的问题。我相信这是因为请求响应线程的性质。当前的过程是,接收请求,检查数据库中是否有冲突的时间预约,如果没有,则插入。根据读取和插入之间的时间不同,两者都有可能被插入。场景看起来是这样的:

代码语言:javascript
复制
|------|-------|-------|
R1     C1      I1     RSP

-|--------|-------|---------|
R2       C2     I2   RSP

其中R=请求,C= DB检查,I=插入。

因此,我相信我可以使用@Synchronized注释,它将强制所有线程排序。这个问题是因为有多个实例在运行,所以不能在所有实例中运行。悲观或乐观的读写似乎不适用,因为我们正在尝试进行读写组合,除非我完全误解了。你有什么想法来处理这个大规模的问题吗?我更喜欢在java中通过表锁或类似的东西来处理它,而不是添加额外的服务(kafka,redis等)。

编辑:数据库看起来像这样,在开发中使用h2,在生产中使用mysql。

代码语言:javascript
复制
 id |  start_time  | locationid | postingid | userid | durration
 --------------------------------------------------------------- 
EN

回答 3

Stack Overflow用户

发布于 2019-03-04 17:52:34

从头开始实现这样的东西并不是什么火箭科学,但也许您可能想看看这个GitHub项目:https://github.com/alturkovic/distributed-lock

我既没有参与这个项目,也没有使用它,但它看起来非常有前途。您只需要使用EnableJdbcDistributedLock创建一个Spring配置

代码语言:javascript
复制
@Configuration
@EnableJdbcDistributedLock
public class LockConfiguration {
}

并创建所需的数据库表:

代码语言:javascript
复制
create table lock (
  id int not null auto_increment primary key,
  lock_key varchar(255) unique,
  token varchar(255),
  expireAt timestamp,
);

一旦准备就绪,您就可以通过一个简单的注释(取自项目的示例)来同步分布式环境中的方法调用:

代码语言:javascript
复制
@JdbcLocked(expression = "#name")
public String sayHello(final String name) {
  return "Hello " + name + "!";
}
票数 4
EN

Stack Overflow用户

发布于 2019-03-07 01:52:03

数据库应该可以处理这个问题。您可以执行以下任一操作:

您可以使用命令行SQL client在本地测试您的更改:打开两个并发事务,并尝试以不同的方式交错使用SELECTINSERT

票数 1
EN

Stack Overflow用户

发布于 2019-03-07 22:42:11

我认为合理的做法应该是锁定位置。如果我对域名的理解正确的话,您是在为开始时间和持续时间指定的时间段保留特定的位置(例如房间)吗?在这种情况下,您可能已经有了一个位置实体。如果没有,您也许可以创建一个表并添加一个匹配表。这样代码就会很简单:

从请求中获取位置上的悲观锁使用JPA reservation

  • Commit

  • 检查数据库中的conflicts

  • Insert新reservation

  • Commit

表锁确实会影响可伸缩性,但锁定特定位置应该是可行的。

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

https://stackoverflow.com/questions/54875853

复制
相关文章

相似问题

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