java - 防止跨多个服务器重复 POST API 调用

标签 java spring oracle spring-boot jdbc

假设我有一个 SPA 应用程序来管理用户详细信息(姓名、年龄等),其结构如下:

SPA <--> my-api-servcie.com VIP <--> [my-api-server-1.com, my-api-server-2.com]

API 是使用 SpringBoot、Java、Spring JDBC、oracle 12c 构建的

我想强制该名称是唯一的。但是,我无法控制数据库模式,并且无法向名称列添加唯一约束。不管怎样,我确实采取了以下预防措施:

  • 前端级别
    • 验证以防止重复名称
    • 悬停全屏旋转器以防止意外点击
  • API 级别
    • 验证以防止重复名称

考虑到上述所有内容后,其中一个应用程序用户成功发送了 2 个 POST 请求,这两个请求均成功通过了上述所有验证。

调用看起来像这样,每个请求需要几毫秒才能完成:

POST my-api-server-1.com/user {name:"Sam"} at 15-JUN-18 02.11.20.000000000 PM
POST my-api-server-2.com/user {name:"Sam"} at 15-JUN-18 02.11.23.000000000 PM 

首先这两个请求都成功了,尽管它们相隔近 2 秒,这似乎很奇怪。因此从技术上讲,第二次调用不应该通过 API 级别的验证。这种行为的原因是什么?是否有一些短期的 JDBC 或 Oracle 层变现?

第二,除了添加数据库约束之外,我还可以采取哪些其他预防措施?

我可以使用同步方法,但这会导致一些性能后果。

最佳答案

同步在您的情况下是不可行的,因为您明确声明您正在使用两个应用程序服务器。在两个不同 VM 中运行的同步方法显然在这两个 VM 之间不同步。

此外,我不知道您实现的确切细节(也许您可以分享 application.properties 的匿名版本),但您很可能启用了 Hibernate 缓存。

这些缓存的行为完全透明,这意味着当您的应用程序查询实体时,很可能该实体是从缓存而不是数据库提供服务的。在您的例子中,您正在使用两个应用程序服务器,每个应用程序服务器都使用自己的数据库缓存。

关于java - 防止跨多个服务器重复 POST API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55012856/

相关文章:

java - 针对父类中定义的@RequestMapping使用多个子 Controller

java - 使用 Spring Jms 问题异步发送到队列

java - 打印 HttpServletRequest JSON 内容

c++ - 在 Oracle OCCI/OCI 中,读取 LOB 的缓冲区是否应该大于实际数据?获取 ORA-32116

java - 如何使用 Jersey 客户端发布 XML 文件?

java - 由于包含在布局中的 NullPointerException 而获取 "Unfortunately, my_app has stopped."

java - 泛型上的 Groovy 映射和 Java 映射

java - Spring Boot 无法正常工作出现一些错误?

oracle - diff 本地包与数据库包

oracle - oracle中获取表的主键列