让我们说我有一个SPA应用程序,用于管理具有以下结构的用户详细信息(姓名,年龄等):
SPA <-> my-api-servcie.com VIP <-> [my-api-server-1.com,my-api-server-2.com]
API是使用SpringBoot,Java,Spring JDBC和oracle 12c构建的
我要强制名称唯一。但是,我无法控制数据库模式,也无法向名称列添加唯一约束。无论如何,我确实实施了以下预防措施:
将以上所有内容都考虑在内,其中一个应用程序用户设法发送了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层?
第二,除了添加数据库约束之外,我还可以采取其他哪些预防措施?
我可以使用同步方法,但这会导致一些性能后果。
答案 0 :(得分:1)
在您的情况下,同步是不可行的,因为您明确声明正在使用两个应用程序服务器。在两个不同的VM中运行的同步方法显然在这两个VM之间不同步。
我还不知道实现的确切细节(也许可以共享application.properties
的匿名版本),但是很有可能已启用了Hibernate缓存。
这些缓存的行为是完全透明的,这意味着当您的应用程序查询实体时,很可能是从缓存而不是数据库为该实体提供服务。再次以您的情况为例,您正在使用两个应用程序服务器,每个服务器都使用自己的数据库缓存。