我正在尝试同步多个数据库,其项目具有 ID 的 GUID,这意味着一个项目在所有数据库上具有相同的 ID。
我的问题是:如果我在 1 个数据库上修改或创建项目,并希望将此更改同步到另一个数据库,我应该:
1.) 检查项目是新的还是刚刚修改的,如果是新的,则使用 save() 函数,如果已修改,则使用 update() 函数
或者
2.)不要检查它是新的还是修改的,只使用 saveOrUpdate() 函数?
在评论中看到您的用例后,我认为最好的方法是跟踪(在客户端和服务器上)上次更新/上次同步时间的时间。如果上次同步时间为空,或者在上次更新时间之前,您就知道需要同步数据。
现在,进入您问题的核心:如何同步它。客户端在向您发送对象时不需要知道服务器的状态。事实上,它不应该。考虑客户端发布一个对象,您的服务器接收并处理它,但连接在您的客户端收到响应之前断开的情况。这是一个非常有效的场景,会导致数据不匹配。因此,您尝试确定服务器是否(从客户端)接收到对象的任何方式都可能最终处于错误状态。
最好的解决方案实际上是在服务器上创建一个幂等端点(一种 upsert 方法,或者saveOrUpdate
您在问题中提到的方法),它能够确定如何处理该对象。服务器可以通过主键查询它的数据库以确定它是否有对象。如果是,它可以更新,如果不是,它可以插入。
可以理解的是,性能和数据一样重要。但是,坚持使用数据库中的主键,并且您添加的一个额外的选择查询应该非常少(低于 10 毫秒)。如果你真的想挤出更多的性能,你总是可以使用 memcache 或 redis 作为缓存层来确定你的数据库中是否有特定的 GUID。这样,您只需访问内存(而不是数据库)即可确定对象是否存在。其开销只能通过 Web 服务器和缓存服务器之间的延迟来衡量(因为内存读取非常便宜)。
tl;博士
Upsert(或saveOrUpdate
)是要走的路。尽量不要在另一台机器上跟踪一台机器的状态。