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

Java 防止跨多个服务器重复POST API调用,java,spring,oracle,spring-boot,jdbc,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、SpringJDBC、Oracle12C构建的 我想强制该名称是唯一的。但是,我无法控制DB模式,也无法向name列添加唯一约束。无论如何,我确实采取了以下预防措施: 前端电平 验证以防止名称重复 Layour全屏微调器,防止意外点击 API级别 验证

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

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

API是用SpringBoot、Java、SpringJDBC、Oracle12C构建的

我想强制该名称是唯一的。但是,我无法控制DB模式,也无法向name列添加唯一约束。无论如何,我确实采取了以下预防措施:

前端电平 验证以防止名称重复 Layour全屏微调器,防止意外点击 API级别 验证以防止名称重复 在挖掘了上述所有内容后,其中一个应用程序用户成功地发送了两个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层是否存在短期兑现

第二,除了添加DB约束,我还可以采取哪些预防措施


我可以使用synchronized方法,但这会导致一些性能问题

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

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


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

基于用户名同步访问,如果您在服务器上使用,这将起作用。但是,在本例中,我使用多个服务器,但您可以使用另一个集中式数据库来仅同步access。或者只使用单独的集中式服务进行用户注册。您还可以使用eg Hazelcast跨集群同步java构造。作为最后手段,请使用表锁定。是的,您是对的,在这种情况下,同步无法解决我的问题。我正在使用SpringJDBC。我的情况没有冬眠。好吧,我错过了那一点。